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

tej*_*oro 9 c c++ performance xor variable-assignment

我意识到差异可以忽略不计,但是在尝试将无符号长度归零时哪个更有效?

unsigned long x;

...

x=0;

--OR--

x^=x;
Run Code Online (Sandbox Code Playgroud)

泰勒

小智 30

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

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

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

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


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

  • 我赞成它,即使问题是关于C而不是关于COBOL:D (11认同)

Mat*_*son 11

首先,如果没有为变量赋值,那么在技术上"未定义的行为"除了为其赋值之外还要做任何事情.

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

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

  • 实际上,将寄存器自身编号是将其归零的标准和最快方法.现代硬件将其作为一种特殊情况,以避免读取依赖性.它通常通过寄存器重命名与零寄存器池来解决. (4认同)
  • 第一段+1.这里最重要的一点是,试图通过"xor技巧"将未初始化的变量设置为0的代码具有未定义的行为.编译器可以完全自由地将此类操作视为语句无法访问的承诺,并将无法访问的状态传播到无条件地导致该语句的任何其他代码. (2认同)