char*与之前指令中设置的值的比较没有被优化掉?

Mar*_* Ba 6 c++ optimization strict-aliasing language-lawyer

在摆弄一些测试代码的同时,我在以下代码中观察到:

extern char* pc;
int muysimple() {
  *pc = 0;
  if (*pc != 0) { return 1111; }

  return 4444;
}
Run Code Online (Sandbox Code Playgroud)

比较是没有任何的编译器,我可以在选择优化掉godbolt.

如果我将其更改extern char*为a extern int*,则比较被优化掉.

为什么gcc和clang都会保持比较char,即使此代码中似乎没有任何内容可以合法地更改值,以便比较评估为真?

语言规范中是否有任何内容禁止写入/读取char*的优化(但允许优化int*!)或者优化器是否更加保守?


正如已经在评论中提到的那样:我没有看到 - 规则明智 - 别名规则如何在这里发挥作用.这个代码只有一个变量可见,没有多线程或任何地方的调用.

当然,char别名规则很可能是编译器没有对此进行优化的实际原因,但这里的问题是编译器是否被允许优化它char*- 就像它们那样int*- 或者它们是否真的不允许优化这个.

小智 6

即使此代码中似乎没有任何内容可以合法地更改值,以便比较评估为真?

pc = (char *) &pc;是一个有效的赋值,并且由于char左值可以用于访问任何POD类型,因此赋值*pc可能会发生变化pc.