我想创建一个总是返回零的函数,但这个事实对优化器来说不应该是显而易见的,因此使用该值的后续计算不会由于“已知零”状态而不断消失。
在没有链接时优化的情况下,这通常就像将其放入自己的编译单元一样简单:
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/