Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ^=是否在内存中创建临时变量?_C++_Variables_Bitwise Operators_Xor - Fatal编程技术网

C++ ^=是否在内存中创建临时变量?

C++ ^=是否在内存中创建临时变量?,c++,variables,bitwise-operators,xor,C++,Variables,Bitwise Operators,Xor,使用位运算符^=时是否在内存中创建临时变量 举个例子,如果我有: a ^= b; 它是否在内存中创建一个副本,然后对照它进行检查,然后分配?或者它只是直接检查然后赋值,而不创建临时变量 这是一个特定于编译器的问题,但我用g++-O2和clang++-O2进行了尝试。它汇编了以下内容: int main (int argc, char** argv) { int a = argc, b = argc * 3; a ^= b; return a; } 到 a^=b部分响应

使用位运算符^=时是否在内存中创建临时变量

举个例子,如果我有:

a ^= b;

它是否在内存中创建一个副本,然后对照它进行检查,然后分配?或者它只是直接检查然后赋值,而不创建临时变量

这是一个特定于编译器的问题,但我用g++-O2和clang++-O2进行了尝试。它汇编了以下内容:

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

a^=b部分响应xorl行,正如您所看到的,xorl行是一条指令。因此gcc没有创建并分配一个新变量,只是将操作直接留给CPU


请注意,您应该纯粹因为觉得它有趣而查看它。从性能的角度来看,您不应该关心这些事情,而应该将其留给编译器。这在优化这些东西方面是非常好的,所以请将您的时间和知识集中在编写正确且可读的代码上

这里发生的情况如下:

read a
read b
xor the previously variables
store result in a
变量是大多数编程语言(但不是所有编程语言)中使用的高级构造。这里没有创建变量

变量与内存不同。当上述代码在CPU上执行时,如果操作数尚未存储在寄存器中,CPU必须从ram加载操作数。这种操作的输入或输出是否存储在RAM或寄存器中取决于前面和后面的操作


因此,简而言之:没有变量,数据在使用前最容易复制,但不一定存储在RAM中。

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

一种可能的情况可能是:

将a的值加载到寄存器中,比如eax f.e。; 将b的值加载到另一个寄存器,比如ebx; 对存储在两个寄存器中的值进行异或运算,结果进入其中一个寄存器eax,f.e。; 将eax寄存器中的值存储到内存中,地址为a。 变量a和b本身可能无法在内存中占有一席之地,如果它们是用常量值初始化的局部变量,那么它们的生命只能在处理器寄存器中度过,它们的生命周期很短,编译器决定将它们存储在这里只是为了在函数返回时忽略并丢弃几个指令,这是浪费时间和内存


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

您的提问是出于好奇还是过早优化?这有关系吗?不…编译器可以做任何一个。你无法观察到差异。你为什么在乎?从某种意义上说,很可能在CPU寄存器中而不是RAM中存在一个临时寄存器。它被定义为a=a^b,所以从技术上来说是的,但根据“仿佛”规则,也允许实现。最可能的实现是两个加载、一个xor、一个存储,因此在register@IgorTandetnik甚至不需要临时寄存器……例如,在x86上,大多数二进制指令的目标是一个操作数,即。Gxor eax,ebx表示eax=eax xor ebx,在硬件中实现,没有任何加载/存储。哪种编程语言没有变量的概念?
read a
read b
xor the previously variables
store result in a