C++ 堆栈收缩和扩展
我想检查基于局部变量声明和函数调用的堆栈收缩/扩展。为此,首先我使用了下面的C风格C++代码-< /P>C++ 堆栈收缩和扩展,c++,memory,stack,C++,Memory,Stack,我想检查基于局部变量声明和函数调用的堆栈收缩/扩展。为此,首先我使用了下面的C风格C++代码-< /P> #include <stdio.h> void MyFunc() { int k = 3; printf("%d: %p\n", k, &k); } int main() { int i = 1; printf("%d: %p\n", i, &i); int j = 2; printf("%d: %p\n",
#include <stdio.h>
void MyFunc()
{
int k = 3;
printf("%d: %p\n", k, &k);
}
int main()
{
int i = 1;
printf("%d: %p\n", i, &i);
int j = 2;
printf("%d: %p\n", j, &j);
MyFunc();
int l = 4;
printf("%d: %p\n", l, &l);
return 0;
}
根据(此处)[的解释,输出是有意义的。
当我们分配新的局部变量j
时,堆栈地址减少0x4。类似地,当调用函数时,输出2和3之间的地址减少更大。最后,当函数返回时,地址中有一个扩展(在3和4之间)
但是,如果我使用iostream
库输出变量及其地址(并使用g++
编译),我似乎会得到一些差异-
在本例中,我们看到堆栈由0x4从1扩展到2(即当j
被声明时)。然而,在函数调用期间,地址收缩(由0x2c从输出2到3)。根据答案(此处)[,我理解堆栈根据体系结构向上或向下增长。在第一种情况下,堆栈在局部变量分配/函数调用期间收缩。但在这里,堆栈在局部变量声明期间展开,但在函数调用期间收缩
对此有何解释?如果您使用启用的优化构建程序,您会更加惊讶。您观察到的所有内容都是实现定义的。如果您不是编译器的开发人员,请不要为此烦恼。不要忘记异常处理。它的一些内容放在堆栈上。即使在第二个示例中,您也可以看到堆栈向下增长。
3:0x7ffda2bb7fb4
仍然是所有地址中的最低地址。我希望在main()
中立即分配局部变量的存储(在这两种情况下)。哪个局部变量使用编译器以某种方式分配的地址。似乎样本和编译器之间的顺序不同。但是,@S.M.已经给出了原因…如果有疑问,请尝试您的示例。main()中的i
、j
和l
的存储
在这一行中提供:31 sub rsp,16
;-)如果您使用已启用的优化构建程序,您会感到更惊讶。您观察到的所有内容都是实现定义的。如果您不是编译器的开发人员,请不要为此烦恼。不要忘记异常处理。它的一些内容放在堆栈上。即使我在第二个示例中,您可以看到堆栈向下增长。3:0x7ffda2bb7fb4
仍然是所有地址中的最低地址。我希望main()
中的局部变量存储会立即分配(在这两种情况下)。哪个局部变量使用编译器以某种方式分配的地址。似乎样本和编译器之间的顺序不同。但是,@S.M.已经给出了原因…如果有疑问,请尝试您的示例。main()中的i
、j
和l
的存储
在这一行中提供:31子rsp,16
;-)
1: 0x7ffd216a8818
2: 0x7ffd216a8814
3: 0x7ffd216a87ec
4: 0x7ffd216a8810
#include <iostream>
void MyFunc()
{
int k = 3;
std::cout << k << ": " << &k << "\n";
}
int main()
{
int i = 1;
std::cout << i << ": " << &i << "\n";
int j = 2;
std::cout << j << ": " << &j << "\n";
MyFunc();
int l = 4;
std::cout << l << ": " << &l << "\n";
return 0;
}
1: 0x7ffda2bb7fdc
2: 0x7ffda2bb7fe0
3: 0x7ffda2bb7fb4
4: 0x7ffda2bb7fe4