不同编译器中的纯/常量函数属性

新手上路,请多包涵

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 许可协议

阅读 361
1 个回答

一般来说,似乎几乎所有的编译器都支持 GCC 属性。 MSVC 是迄今为止唯一不支持它们的编译器(也没有任何替代方案)。

原文由 Albert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题