里面的变量会发生什么

What happens to the variables inside?

本文关键字:什么 变量      更新时间:2023-10-16

该函数中的变量会发生什么变化?

void function()
{
   int a = 5;
   a += a; //a contain 10
}
int main()
{
   function();
   return 0;
}

那么在函数(function(((执行完成后这里发生了什么,这个变量(a(是否仍然在内存中找到(使用内存(,其最后一个值是(10(还是完全销毁并且不再在内存中?

它并没有真正指定。我将首先描述这个幼稚的情况,然后解释为什么它可能并不真正适用。

天真地,存储a的内存仍然存在,尽管a名称在function之外不再可用。内存可能仍然包含也可能不包含10 - 编译器可以自由覆盖它或不打扰它。显然,它也可以在之后的任何时候作为其他东西重复使用。

如果a确实内存中分配,则可能位于称为(调用(堆栈的区域,但这只是一个流行的调用约定,不是语言所要求的。

现在,编译器也可以自由地仅将a存储在寄存器中,因为它注意到地址从未被占用,在这种情况下,它从未在传统意义上的内存

编译器还可以自由地注意到,a 从未被观察到使用过,并且不会费心发出 function 中的任何代码。

通常存储在堆栈上,即它是自动分配的,并且这些自动分配的内存在每次函数调用时都会被回收。编译器可能会认为此变量实际上无用,并完全忽略它,因为它从未使用过,也不会影响代码的任何其他部分,因此可能发生的情况是:什么都没有。

在 C 和 C++ 中,重要的是要记住局部变量之间存在巨大差异,局部变量被认为是自动分配的,只有在函数执行时才能生存,而指针和new则通过指针和动态分配,直到它们被delete删除或程序终止。

当函数结束时,它的所有局部变量基本上都消失了(更准确地说,当它们的块结束时,它们消失了(。

谈论它们的"最后一个值"留在"内存中"是一个相当没有意义的练习,因为它们的值可能从一开始就从未出现在内存中。即使有,也不能保证它仍然存在,或者该记忆在任何意义上仍然可以访问。