在C/C++中,左移或右移零实际上会生成一条指令吗?
In C/C++, does left or right shift by ZERO actually generate an instruction?
我对汇编语言或反汇编二进制代码不是很熟悉,谁能告诉我,"x <<= 0;"或"x >>= 0;"是否真的会生成指令?
这实际上取决于编译器以及启用了哪些优化。尽管如此,即使优化是 -O0
.
,GCC 似乎也将它们视为无操作
而带有 -O0
的 CLANG 会考虑它们并生成指令。
-O1
及更高版本的编译器都优化了这些指令。
如果x
是整数类型,x >>= 0
和x <<= 0
应该不会生成任何代码。然而,在某些特定情况下,编译器可以而且确实应该生成代码:
如果关闭优化(clang -O0
或 gcc -O0
),编译器可能会生成代码,在 clang
的情况下,将会。但这不是必需的。
如果 x
是 volatile
限定类型,编译器 需要 生成代码以读取其值并写回读取的值。实际的移位对值没有任何影响,因此生成的代码可能与为 x = x;
.
生成的代码相同
我对汇编语言或反汇编二进制代码不是很熟悉,谁能告诉我,"x <<= 0;"或"x >>= 0;"是否真的会生成指令?
这实际上取决于编译器以及启用了哪些优化。尽管如此,即使优化是 -O0
.
而带有 -O0
的 CLANG 会考虑它们并生成指令。
-O1
及更高版本的编译器都优化了这些指令。
如果x
是整数类型,x >>= 0
和x <<= 0
应该不会生成任何代码。然而,在某些特定情况下,编译器可以而且确实应该生成代码:
如果关闭优化(
clang -O0
或gcc -O0
),编译器可能会生成代码,在clang
的情况下,将会。但这不是必需的。如果
x
是volatile
限定类型,编译器 需要 生成代码以读取其值并写回读取的值。实际的移位对值没有任何影响,因此生成的代码可能与为x = x;
. 生成的代码相同