内存是否具有堆栈和堆物理结构?

时间:2015-09-18 14:05:19

标签: heap-memory stack-memory

我有一些与内存结构有关的问题。

堆栈和堆是由OS决定的吗?还是他们分开了?

如果它们由OS决定,哪个操作系统有堆栈和堆作为内存结构的组件除了Windows?

我知道默认堆栈大小是1MB,我可以手动扩展大小,但为什么默认大小这么小?

如果堆栈大小为1MB,我不能在本地变量中保存超过1MB的数据吗?

我的最后一个问题是,如果程序员编写非托管代码(例如本机C ++)而不是托管代码(例如C#),是否有任何理由需要更多地了解内存结构?

1 个答案:

答案 0 :(得分:1)

默认堆栈大小取决于操作系统。有些很小,有些很大。堆栈和堆是物理上分开的#34;在他们的地址不同的意义上。

差异对程序员来说很重要的原因很多:

    当函数/方法返回时,
  • 堆栈上的分配将自动解除分配
  • 即使机器有空闲内存(由于堆栈大小限制),堆栈上的大量分配也可能耗尽内存。
  • 在某些环境中(例如C#,Java,Python,JavaScript),而所有局部变量都在堆栈上分配(如在C,C ++中),在堆栈上分配的变量都是引用(类似于指针),所以总是使用持续少量的堆栈内存
  • 递归或深度函数/方法调用可能会耗尽堆栈空间
  • 堆栈上的分配和释放比堆上的更快(编译器计算大小并在输入函数时将其包含在单个指针移动操作中,没有可用于扫描的空闲列表或任何内容 - 这适用于C和C ++但不是C#,Java等。)
  • 永远不会返回指向堆栈上分配的数据的指针;如果你这样做,那么你最好会崩溃你的程序,最坏的情况是不知道发生了什么数据损坏
  • 堆栈上的分配永远不会导致内存泄漏;堆上的分配可以泄露
  • 堆栈上的数据是函数的本地数据(除非它将指向它的指针传递给它调用的函数),因此是线程安全的;可以从多个线程访问堆上的数据,并且可能需要适当的同步控制