pure是一个函数属性,表示函数不会修改任何全局内存。
const是一个函数属性,表示函数不读取/修改任何全局内存。
有了这些信息,编译器就可以进行一些额外的优化。
海湾合作委员会示例:
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)); }
在该示例中,编译器可以优化该函数计算 to:
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: 纯/常量函数属性 http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
- LLVM-海湾合作委员会:支持 GCC pure/const 属性 http://llvm.org/releases/2.2/docs/ReleaseNotes.html
- Clang: 看来支持 http://llvm.org/releases/2.4/docs/ReleaseNotes.html(我尝试了一个带有 GCC 样式属性的简单示例,它成功了。)
- ICC: 似乎采用了 GCC 属性 http://software.intel.com/en-us/forums/showthread.php?t=62309(抱歉,只是论坛帖子。)
- MSVC:好像不支持。 (讨论 https://connect.microsoft.com/VisualStudio/feedback/details/804288/msvc-add-const-and-pure-like-function-attributes)
一般来说,似乎几乎所有编译器都支持 GCC 属性。 MSVC 是迄今为止唯一不支持它们的编译器(并且也没有任何替代方案)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)