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)); }
在该示例中,编译器可以将函数 计算 优化为:
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 或其他?
原文由 Albert 发布,翻译遵循 CC BY-SA 4.0 许可协议
一般来说,似乎几乎所有的编译器都支持 GCC 属性。 MSVC 是迄今为止唯一不支持它们的编译器(也没有任何替代方案)。