C / C ++:将0赋值给无符号长变量或者将变量与自身进行xor分解是否更快?

时间:2013-04-04 16:40:01

标签: c++ c performance variable-assignment xor

我意识到这种差异可以忽略不计,但在尝试将无符号长整齐为零时更有效?

unsigned long x;

...

x=0;

--OR--

x^=x;

泰勒

3 个答案:

答案 0 :(得分:30)

如果你要实现编译器,你会怎么做?实际上,你会为两者选择最快的实现。由于两者都相同,因此这两种方法的实现速度最快。

换句话说,任何编译器在公元前5000年之后发布。如果启用优化,则会为x = 0x ^= x生成相同的汇编代码。这意味着它们同样快速。

这不仅适用于赋值/ xorring,也适用于multiplication以及其他算法。 表达您的意图并让编译器对其进行优化。编译器在优化方面比您更好,相信我。

换句话说,编写可读代码并使用x = 0;


哦顺便说一句,按位xorring一个未初始化的整数本身是未定义的行为,一个好的编译器应该优化整个事物。

答案 1 :(得分:11)

首先,如果没有为变量赋值,那么在技术上“未定义行为”除了为其赋值之外还要执行任何操作。

其次,对于XOR而言,它在过去15到20年间生产的处理器上不太可能更快,因为它需要额外的读取。它可能在很长一段时间内更快(由于是SHORTER CODE),但实际上,我相信即使这是错误的。

编辑:我应该指出,在现代处理器中对寄存器进行异或后,它可能仍然更快/更紧凑。但是如果我们假设我们不知道x是否在寄存器中,那么我们也不应该让编译器更复杂地确定我们实际在做什么。

答案 2 :(得分:2)

为什么要推测编译器的作用?让我们试一试吧!

这是一些测试代码:

void fzero()
{
   unsigned long x;

   x = 0;
}

void fxor()
{
   unsigned long x;

   x ^= x;
}


int main()
{
   fzero();
   fxor();
}

现在让我们看看生成的机器代码:

; 10   :    unsigned long x;
; 11   : 
; 12   :    x ^= x;
; 13   : }

00000   c2 00 00     ret     0

; 3    :    unsigned long x;
; 4    : 
; 5    :    x = 0;
; 6    : }

00000   c2 00 00     ret     0

PUBLIC  main
; Function compile flags: /Ogtpy
;   COMDAT main
_TEXT   SEGMENT
main    PROC                        ; COMDAT

; 18   :    fzero();
; 19   :    fxor();
; 20   : }

  00000 33 c0        xor     eax, eax
  00002 c3       ret     0
main    ENDP

哦,看!它们同样快速,均为0 ns。