C++ 重新分配已存储在目标变量中的一个值是否会导致重写和更长的运行时间?

C++ 重新分配已存储在目标变量中的一个值是否会导致重写和更长的运行时间?,c++,c,performance,memory,variable-assignment,C++,C,Performance,Memory,Variable Assignment,我真正关心的是,如果我编写一个表达式,导致将一个值赋值给一个变量,而我要赋值的值已经存储在这个变量中,会发生什么情况 例如: #include <stdio.h> int main(void) { int var = 1; printf("The actual value of var is %d",var); var = 1; // What happens exactly if

我真正关心的是,如果我编写一个表达式,导致将一个值赋值给一个变量,而我要赋值的值已经存储在这个变量中,会发生什么情况

例如:

#include <stdio.h>

int main(void)
{
     int var = 1;

     printf("The actual value of var is %d",var);

     var = 1;                                  // What happens exactly if I bring in this expression?
                                               // Does it rewrite the memory?
     return 0;
}
#包括
内部主(空)
{
int-var=1;
printf(“var的实际值为%d”,var);
var=1;//如果我引入这个表达式,会发生什么?
//它会重写记忆吗?
返回0;
}
它是否将内存中
1
的值重写为
var
,这是否会导致运行时间延长

或者它似乎只是跳过了赋值命令


我已经寻找了一个确切的答案,但我找不到一个已经在这里提出的内部问题,也找不到我看到的C99中的问题

问题是C和C++,因为我和两个都一起工作,所以我不想再做两次同样的问题。如果答案介于这两种选择之间,请说明重点是哪种语言。

让我们试试:

如您所见,此编译器重新分配值。
var=1语句转换为
mov
指令。现在,让我们用更高的优化级别来尝试:

现在
var=1不会转换为任何程序集。它已经被优化了。甚至
intvar=1已优化,现在为该
printf
调用对
1
的值进行了硬编码


一般来说,这取决于编译器、选项、语言以及其他很多因素。如今,现代编译器通常会优化此类代码,但如果你想确定,你应该自己尝试。

即使在最坏的情况下,你真的希望观察到现代多Ghz CPU和RAM的实际差异吗?另外,在这种情况下不会发生任何事情,因为编译器显然会优化冗余赋值。因为你无法区分两者之间的区别,所以这个问题没有真正的意义。你问的是两件不可区分的事情中的哪一件发生了。这是为什么?您是否已将变量分配衡量为程序中的瓶颈?在你解决了所有顶级瓶颈之前,不要为微观优化而烦恼(尤其是像这样基本上无法测量的优化)。我不知道这个问题有什么问题。只有当你觉得清晰且格式正确的问题“愚蠢”时,才不要投票否决它。@Someprogrammerdude这只是一个理论问题。我知道,这个项目不会因为这次任务而明显延误。只是一个关于源代码的问题。它特别取决于周围的代码和中间代码。例如,如果通过引用插入对定义不可用的函数的调用,则编译器无法再证明第二个存储可以在不改变行为的情况下消除。对于一个全局变量,任何没有可用定义的函数调用都会妨碍消除,等等。但是
printf
的定义是已知的(根据它的定义,如果它不做编译器可以假设的事情,它将是UB)@AnttiHaapala True,它也不会通过引用或指针获取
var
。在这种特殊情况下,最后一个存储的值永远不会被使用,所以它总是可以被优化。因此,周围代码和中间代码是相关的。例如,由于gcc不使用总是已知的
printf
的定义不修改传递给它的指向值这一事实,因此未消除存储。