C++ 微观优化:x&1与x%2

C++ 微观优化:x&1与x%2,c++,micro-optimization,C++,Micro Optimization,就速度而言,哪个最快?为什么 x&1 //checks last bit 或 根据“仿佛”规则,如果两个结果具有相同的效果,编译器可以自由地用一个结果替换另一个结果 只有当它们给出不同的结果时,才能说其中一个比另一个更理想 在这种情况下,可能是负数?在x%2下返回一个负结果,对于许多整数值,x&1可能未定义,或者至少实现已定义 但是,如果它们是基于有符号整数的2s补码表示法定义的,然后对它们求值if条件,那么它们再次变得等价,在这种情况下,编译器可以自由地用一个替换另一个,并且两者都比

就速度而言,哪个最快?为什么

x&1 //checks last bit


根据“仿佛”规则,如果两个结果具有相同的效果,编译器可以自由地用一个结果替换另一个结果

只有当它们给出不同的结果时,才能说其中一个比另一个更理想

在这种情况下,可能是负数?在x%2下返回一个负结果,对于许多整数值,x&1可能未定义,或者至少实现已定义


但是,如果它们是基于有符号整数的2s补码表示法定义的,然后对它们求值if条件,那么它们再次变得等价,在这种情况下,编译器可以自由地用一个替换另一个,并且两者都比另一个快。

可能两者都不是。或者两者兼而有之。这取决于你的乐观程度,取决于你的处理器course@indiv谢谢你找到那个复制品!取决于CPU体系结构以及手头的编译器。例如,如果您使用的是定点处理器,那么每个除法或模运算都会被一个函数调用所替代。该函数通常与给定处理器的软件包一起提供。这实质上会产生比人们期望的诸如%之类的算术运算更糟糕的性能。但在许多情况下,一个好的编译器会知道如何选择退出操作,例如%2,即用它代替&1。@BlackBear胡说八道。如果对其进行了优化,两者都将简化为规范形式,可能是编译器编写者知道的最快的变体。如果没有优化,没有一个ALU不能以尽可能最好的吞吐量和延迟执行二进制操作-这是一个非常简单的操作,即使你可以神奇地使模操作免费,你也不能更快地执行任何操作。假设这两种形式是等价的,我不确定C对负x的要求是什么。
x%2 // performs modulo operation