c++ 堆栈内存地址差异

sulc1iza  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(145)

我是c++新手。
我有两段代码。

第一次

#include <iostream>

int main()
{
    int firstInteger = 1;
    std::cout << "First memory adress: " << &firstInteger << std::endl;
    int secondInteger = 2;
    std::cout << "Second memory adress: " << &secondInteger << std::endl;

    return 0;
}

结果是

First memory adress: 00000039A2F7F934
Second memory adress: 00000039A2F7F954

第二个整数具有更大的十六进制值。

第二次

#include <iostream>

void someFunction() {
    int secondInteger = 2;
    std::cout << "Second memory adress: " << &secondInteger << std::endl;
}

int main()
{
    int firstInteger = 1;
    std::cout << "First memory adress: " << &firstInteger << std::endl;
    someFunction();
    
    return 0;
}

结果是

First memory adress: 00000093953EF744
Second memory adress: 00000093953EF624

这次第一个更大。
有人能解释一下它们之间的区别吗?
谢谢你。

rqqzpn5f

rqqzpn5f1#

不保证不同变量(或一般的完整对象)的地址之间的任何排序或距离,除非对象的存储在它们的生存期内不会重叠。编译器被允许以它认为合理和有效的方式布局堆栈。假设任何排序必须存在是错误的。
例如,在没有启用优化标志的GCC 12.2 x64上,我在两种情况下都得到了第二个变量的较小地址here,但您在启用-O2优化时的行为here

相关问题