^ =在内存中创建一个临时变量吗?

时间:2015-05-25 17:14:07

标签: c++ variables bitwise-operators xor

按位运算符^=在使用时会在内存中创建一个临时变量吗?

所以如果我有一个例子:

a ^= b;

它是否在内存中创建a的副本,然后检查它然后分配?或者只是直接检查然后分配而不创建临时变量?

3 个答案:

答案 0 :(得分:5)

这是一个特定于编译器的问题,但我尝试使用g++ -O2clang++ -O2。它编译了这个:

int main (int argc, char** argv) {
    int a = argc, b = argc * 3;
    a ^= b;
    return a;
}

leal    (%rdi,%rdi,2), %eax
xorl    %edi, %eax
ret

a ^= b部分响应xorl行,如您所见,这是一条指令。所以gcc没有创建然后分配一个新变量,只是将操作直接留给了CPU。

请注意,您应该完全看待它,因为您觉得它很有趣。从性能的角度来看,您应该关心此类事情并将其留给编译器。它非常适合优化这些内容,因此请将时间和知识集中在编写正确且可读的代码上!

答案 1 :(得分:2)

这里发生的事情如下:

read a
read b
xor the previously variables
store result in a

变量是大多数编程语言中使用的高级构造(但不是全部)。这里没有创建变量。

变量与内存不同。当在CPU上执行上面的代码时,CPU必须从ram加载操作数(如果它尚未存储在寄存器中)。这种运算的输入或输出是否存在于RAM(又名“存储器”)或寄存器中,取决于先前和以下的操作。

所以简而言之:没有变量,数据在使用前最常被复制,但不一定存储在RAM中。

答案 2 :(得分:1)

它可能发生在处理器的一个通用寄存器中,而不是内存中,但它取决于很多因素:CPU架构,编译器优化标志,周围代码。

可能的情况可能是:

  • a的值加载到寄存器中(假设为eax f.e。);
  • b的值加载到另一个寄存器中(假设为ebx);
  • xor存储在两个寄存器中的值,结果转到其中一个(eax,f.e。);
  • eax注册表中的值存储到内存中,地址为a

变量ab本身可能无法在内存中占有一席之地,如果它们是使用常量值初始化的局部变量,它们只会在处理器寄存器中生存,它们具有较短的寿命并且编译器会决定将它们存储在这里浪费时间和内存只是为了忽略并稍后丢弃它们(当函数返回时)。

在极端情况下,如果a是局部变量并且在赋值后未使用a的值,则所提供的代码可能根本不会生成CPU指令,例如。