在C/C++中,左移或右移零实际上会生成一条指令吗?

In C/C++, does left or right shift by ZERO actually generate an instruction?

我对汇编语言或反汇编二进制代码不是很熟悉,谁能告诉我,"x <<= 0;"或"x >>= 0;"是否真的会生成指令?

这实际上取决于编译器以及启用了哪些优化。尽管如此,即使优化是 -O0.

,GCC 似乎也将它们视为无操作

Live Demo

而带有 -O0 的 CLANG 会考虑它们并生成指令。

Live Demo

-O1 及更高版本的编译器都优化了这些指令。

如果x是整数类型,x >>= 0x <<= 0应该不会生成任何代码。然而,在某些特定情况下,编译器可以而且确实应该生成代码:

  • 如果关闭优化(clang -O0gcc -O0),编译器可能会生成代码,在 clang 的情况下,将会。但这不是必需的。

  • 如果 xvolatile 限定类型,编译器 需要 生成代码以读取其值并写回读取的值。实际的移位对值没有任何影响,因此生成的代码可能与为 x = x;.

  • 生成的代码相同