相关疑难解决方法(0)

为什么没有一个主要编译器优化这个检查值是否已经设置的条件存储?

我偶然发现了这篇Reddit 帖子,它是对以下代码片段的一个玩笑,

void f(int& x) {
    if (x != 1) {
        x = 1;
    }
}
void g(int& x) {
    x = 1;
}
Run Code Online (Sandbox Code Playgroud)

说这两个函数不等同于“编译器”。我确信任何主要的 C++ 编译器都会将条件赋值优化为无条件存储,从而为f和发出相同的汇编代码g

然而,他们没有。

谁能向我解释为什么会这样?

我的想法是:无条件存储很可能会更快,因为无论如何我们都必须访问内存来读取比较值,并且分支代码会给分支预测器带来压力。此外,编译器不应将存储视为副作用(AFAIK),即使后续内存访问可能会更快或更慢,具体取决于是否f由于缓存局部性而采用分支。

那么编译器就无法弄清楚这一点吗?虽然证明f和 的等价性g可能并不容易,但我觉得这些编译器能够解决更困难的问题。那么我可能错了,这些功能毕竟不相等,或者这里发生了什么?

c++ micro-optimization compiler-optimization

56
推荐指数
3
解决办法
5926
查看次数

是否允许在const定义的对象上抛弃const,只要它实际上没有被修改?

是否允许以下​​内容:

const int const_array[] = { 42 };

int maybe_inc(bool write, int* array) {
  if (write) array[0]++;
  return array[0];
}

int main() {
  return maybe_inc(false, const_cast<int *>(const_array));
}
Run Code Online (Sandbox Code Playgroud)

特别地,它是确定以铸远的常量性const_array,将其定义为const,只要对象是不实际修改,如在实施例?

c++ const const-cast undefined-behavior

12
推荐指数
1
解决办法
349
查看次数