Flip bool: performance comparison of x=!x versus x^=1

Flip bool: performance comparison of x=!x versus x^=1

本文关键字:versus of bool performance comparison Flip      更新时间:2023-10-16

我知道有两种技巧可以翻转bool值:

x = !x

x ^= 1

我更喜欢后者,就像我更喜欢x++而不是x+=1而不是x=x+1一样。

但是它们能保证生成相同的汇编代码吗?

如果不是,是否有理由支持其中一个而不是另一个?

从来没有任何保证相同的汇编代码。是的,给定bool x,它们都做完全相同的事情。是的,这意味着它们很可能是相同的。

用一种不寻常的方式书写表达式可能会使它们更快,这是一个常见的谬论。避免与那些养成这种习惯的人共事。

x = ! x更清晰,因为!是用布尔值定义的。

我更喜欢后者,就像我更喜欢x++而不是x+=1而不是x=x+1一样。

请选择前者。它是大多数程序员所期望和容易理解的。第二种形式,只适用于整数情况下的值0和1。

但是它们能保证生成相同的汇编代码吗?

如果不是,是否有理由支持其中一个而不是另一个?

减少代码中"wtf/loc"的比例(即在每n行代码中,其他开发人员会看到你的代码并说"wtf ?!?"的次数)。

Edit:无论哪种方式,您可能永远不会看到通过用一个表达式替换另一个表达式而使应用程序更快的实际示例。这是一个风格问题,而不是表现问题。

第二个表达式只是一个难以发现bug的来源。例如,您可能认为某些表达式具有bool类型,但由于整数提升或通常的算术转换,其实际类型是整数类型。

考虑以下代码片段

unsigned int x = 3;
x ^= 1;
std::cout << x << std::endl;
if ( x == false ) std::cout << "All is O'kn";
else std::cout << "Oops. Something is wrong!n"; 
x = 3;
x = !x;
std::cout << x << std::endl;
if ( x == false ) std::cout << "All is O'kn";
else std::cout << "Oops. Something is wrong!n"; 

因此,使用表达式x ^= 1;来翻转布尔值只会使代码的读者感到困惑。

所以我更喜欢用x = !x;而不是x ^= 1;

不要忘记原则KISS: Keep It Simple Stupid.:)

虽然在C语言中operator !的结果是int类型,但是操作的值不是0就是1

来自C标准

5逻辑反运算符的结果!的值是0它的操作数比较不等于0,1,如果它的操作数的值比较等于0。

因此,对于两种语言,的任何源值都可以保证结果恰好是0或1。

!xx^1显然是不同的操作。

前者是逻辑否定,返回0/1值。

后者是不相容的或,返回任何可能的值。它不应该用于bool类型。(对于xoring bools,建议使用不相等比较!=)。在未优化的代码中,它的效率也较低,因为它涉及到一个额外的操作数(1)。

K&R忘记提供!!操作符,您可能会喜欢的,还有~~