在C / C ++中,ZERO左移还是右移实际生成指令?

时间:2015-12-05 22:43:00

标签: c++ c bit-manipulation bit

我对汇编语言或反汇编二进制代码不太熟悉,有人可以告诉我,如果" x<< = 0;"或" x>> = 0;"会实际生成说明吗?

2 个答案:

答案 0 :(得分:8)

如果TrxnID, MarkedTrxnID, MarkedAmount ------------------------------------ d1,c3,2000 **Rem : D1 balance=0, c3 balance= 1000 d2,c3,2000 **Rem : D2 balance=1000, c3 balance= 0 d2,c5,1000 **Rem : D2 balance=0, c5 balance= 0 d4,c6,5000 **Rem : D4 balance=0, c6 balance= 1000 d7,c6,1000 **Rem : D7 balance=2000, c6 balance= 0 是整数类型,则xx >>= 0不应生成任何代码。然而,在某些特定情况下编译器可以并且确实应该生成代码:

  • 如果关闭优化(x <<= 0clang -O0),编译器可能会生成代码,如果是gcc -O0,则会生成代码。但它不是必需的。

  • 如果clangx限定类型,则编译器必需生成代码以读取其值并写回读取的值。实际的转移对该值没有任何作用,因此生成的代码可能与为volatile生成的代码相同。

答案 1 :(得分:2)

这取决于编译器以及进行了哪些优化。然而,即使优化是{{​​1}},GCC似乎也认为它们不是操作。

Live Demo

虽然CLANG与-O0正在考虑并生成说明。

Live Demo

-O0及以上的两个编译器都优化了这些指令。