【发布时间】:2010-05-09 15:49:58
【问题描述】:
pure 是函数属性,表示函数不会修改任何全局内存。
const 是函数属性,表示函数不会读取/修改任何全局内存。
根据这些信息,编译器可以进行一些额外的优化。
GCC 示例:
float sigmoid(float x) __attribute__ ((const));
float calculate(float x, unsigned int C) {
float sum = 0;
for(unsigned int i = 0; i < C; ++i)
sum += sigmoid(x);
return sum;
}
float sigmoid(float x) { return 1.0f / (1.0f - exp(-x)); }
在该示例中,编译器可以将函数 calculate 优化为:
float calculate(float x, unsigned int C) {
float sum = 0;
float temp = C ? sigmoid(x) : 0.0f;
for(unsigned int i = 0; i < C; ++i)
sum += temp;
return sum;
}
或者如果你的编译器足够聪明(并且对浮点数不那么严格):
float calculate(float x, unsigned int C) { return C ? sigmoid(x) * C : 0.0f; }
如何为不同的编译器(即 GCC、Clang、ICC、MSVC 或其他)以这种方式标记函数?
【问题讨论】:
-
对于我们这些不经常使用 gcc 的人,也许你可以发布一个关于什么是 pure/const 属性的解释。如果它是某种类型的优化,那么它可以帮助编译器生成更优化的程序集的 C 或 C++ 代码示例也会很有用。
-
我不是编译器编写者,但在我看来,如果
sigmoid()函数定义可用于编译器在解析@ 987654325@在同一个翻译单元。无论如何,当函数定义在不同的翻译单元中时,这些属性肯定会很有用。 -
是的,GCC(和其他编译器)在这种情况下会自动在内部添加此属性。然后,基于属性,他们可以做进一步的优化(就像我的例子一样)。而且您恰好遇到了明确指定它的主要原因之一:如果编译器此时没有看到定义,或者如果定义根本不可用,或者如果您认为编译器减少数量是安全的调用函数。
标签: c++ gcc constants function-attributes