c++ - 创建一个始终返回零但优化器不知道的函数

标签 c++ performance optimization compiler-optimization

我想创建一个总是返回零的函数,但这个事实对优化器来说不应该是显而易见的,因此使用该值的后续计算不会由于“已知零”状态而不断消失。

在没有链接时优化的情况下,这通常就像将其放入自己的编译单元一样简单:

int zero() {
  return 0;
}

优化器无法跨单元查看,因此不会发现此函数的始终为零的性质。

但是,我需要一些可以与 LTO 一起使用的东西,以及尽可能多的 future 可能的智能优化。我考虑过从全局阅读:

int x;

int zero() {
  return x;
}

...但在我看来,一个足够聪明的编译器可能会注意到 x 从未被写入并且仍然决定 zero() 始终为零。

我考虑过使用 volatile,例如:

int zero() {
  volatile int x = 0;
  return x;
}

...但是 volatile 读取所需的副作用的实际语义并不十分清楚,并且似乎不排除该函数仍然返回零的可能性。

这种始终为零但不在编译时的值在多种情况下很有用,例如强制两个值之间的无操作依赖性。类似于:a += b & zero() 导致 a 依赖于最终二进制文件中的 b,但不会更改值一个

不要通过告诉我“标准不能保证任何方式来做到这一点”来回答这个问题 - 我很清楚并且我正在寻找一个实用的答案而不是标准中的语言。

最佳答案

如果编译器能解决这个问题,我会感到很惊讶:

int not_a_zero_honest_guv()
{
    // static makes sure the initialization code only gets called once
    static int const i = std::ifstream("") ? 1:0;
    return i;
}

int main()
{
    std::cout << not_a_zero_honest_guv();
}

这使用了函数局部静态的复杂(不可预测的)运行时初始化。如果顽皮的小编译器发现空文件名总是会失败,那么就会在其中放入一些非法文件名。

关于c++ - 创建一个始终返回零但优化器不知道的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51471889/

相关文章:

c++ - MySQL 段错误,间歇性

c++ - 将 GTKmm 添加到 CodeBlocks - Windows

performance - 在 GLSL 中获取纹理有多昂贵?

javascript - native JavaScript 排序的执行速度比实现的合并排序和快速排序慢

php - 获取 MySQL 表中每个类别的行数

jquery可视化网站优化器代码

c++ - Eigen 用三元组填充稀疏 RowMajor 矩阵

c++ - Cython 和 C++ 类构造函数

regex - 如何优化正则表达式中的边界检查?

optimization - 函数调用导致性能下降