c++ - 堆栈和堆地址区域在 Windows 和 Linux 中是不同的

标签 c++ memory heap-memory stack-memory

我现在正在用C++测试堆和栈的地址区

我的代码是

#include <iostream>
using namespace std;

int g;
int uninitialized_g;

class Heap{

int a;
int b;
};

int main() {

int stack_variable = 3;
int stack_variable_1 = 3;

g = 3;

Heap * heap_class = new Heap;
Heap * heap_class_1 = new Heap;

cout << "Static initialized g's addr = " << &g << endl;
cout << "Static un-initialized g's addr = " << &uninitialized_g << endl;
cout << "Stack stack_variable's addr = " << &stack_variable << endl;
cout << "Stack stack_variable1's addr = " << &stack_variable_1 << endl;
cout << "Heap heap_class's addr = " << heap_class << endl;
cout << "Heap heap_class1's addr = " << heap_class_1 << endl;

delete heap_class;
delete heap_class_1;

return 0;
}

在带有 MinGW 的 windows eclipse 中,结果是

Static initialized g's addr = 0x407020
Static un-initialized g's addr = 0x407024
Stack stack_variable's addr = 0x22fed4
Stack stack_variable1's addr = 0x22fed0
Heap heap_class's addr = 0x3214b0
Heap heap_class1's addr = 0x3214c0

在 linux 中使用 g++ 结果是

Static initialized g's addr = 0x601180
Static un-initialized g's addr = 0x601184
Stack stack_variable's addr = 0x7ffff5c8c2c8
Stack stack_variable1's addr = 0x7ffff5c8c2cc
Heap heap_class's addr = 0x1c7c010
Heap heap_class1's addr = 0x1c7c030

这对我来说很有意义。

所以,问题是,

  1. 在windows结果中,为什么分配的堆内存地址有时比栈高?
  2. 在 Linux 中,堆寻址是有意义的。但是为什么栈地址变高了?

提前致谢。

最佳答案

您的程序在称为操作系统的环境中运行。因此,正如您可能预期的那样,有更多的代码在运行。

1) 栈和堆

第一个线程的栈地址由操作系统定义。您可以在请求某些特定值的 PE32 exe 文件头中设置一些值。但这至少在 Linux 上是不同的。 C 运行时库向操作系统请求一些内存。带有函数 s_brk 的 IIRC。操作系统可以随心所欲地提供内存。请记住,尽管您有线性地址空间,但您没有连续的内存布局。它更像是瑞士奶酪。

2) 局部变量的地址

这是一个未指定的行为。编译器可以自由地为局部变量分配内存中的顺序。有时我看到顺序是按字母顺序排列的(只需尝试重命名)或者它随着优化级别而变化。就接受吧。

关于c++ - 堆栈和堆地址区域在 Windows 和 Linux 中是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446991/

相关文章:

c++ - 无法使用 Visual Studio 2015 构建简单项目

c++ - 关闭或最小化 cmd 窗口

c# - 如何在.NET中以编程方式测量当前进程的总内存消耗?

ios - 当我在 iOS 中收到内存警告时,内存使用阈值是多少

c++ - 当试图释放堆管理器分配的内存时会发生什么,堆管理器分配的内存比请求的多?

c++ - 即使安装了 MSVCP100.dll 也找不到错误

c++ - CMakeLists.txt :30 (project): No CMAKE_C_COMPILER could be found 处的 CMake 错误

c++ - C/C++中的内存分配

java - 为什么在java中,当最终结果是interned对象的不可变副本时,编译器不优化new?

Java 堆分析因 SIGABRT 而崩溃