Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/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++_Memory_Stack - Fatal编程技术网

C++ 堆栈收缩和扩展

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",

我想检查基于局部变量声明和函数调用的堆栈收缩/扩展。为此,首先我使用了下面的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", 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