heap-memory - 直接堆栈和堆访问;虚拟级还是硬件级?

标签 heap-memory virtual-memory stack-memory

当我在 SO 上时,我读了很多指导性的评论(尤其是 C 语言)

“动态分配总是在堆上,自动分配在堆栈上”

但特别是对于普通 C 我不同意这一点。因为 ISO/IEC9899 甚至没有丢弃堆或堆栈的任何字。它只是提到了三种存储持续时间(静态、自动和分配),并建议如何处理它们中的每一个。

如果编译器愿意的话,什么可以让编译器选择这样做,反之亦然。

所以我的问题是:

堆和栈是否物理存在(即使不是在 C 语言中),标准化语言可以说“...必须发生在堆上,...必须发生在栈上”?

或者它们只是一个管理内存访问的虚拟系统,因此语言无法对它们制定规则,因为它甚至无法确保环境支持它们?

在我的知识库中,只有第二个才有意义。但我已经读过很多次人们写的评论,比如“在 XY 语言中,这将发生在堆栈/堆上”。但如果我是对的,只要该语言不仅仅是为保证有堆栈和堆的系统而设计的,那么这一定是不确定的。所有这些评论都是错误的。

这就是我问这个问题的原因。是我错了,还是在推理过程中存在很大的错误?

最佳答案

您是正确的,C 规范不需要使用堆或堆栈,只要它正确实现存储类即可。

但是,实际上每个编译器都会使用堆栈来存储自动变量,使用堆来存储分配的变量。虽然您可以实现不使用堆栈或堆的编译器,但它的性能可能不会很好,并且大多数开发人员都不熟悉。

因此,当人们说“总是”时,他们真正的意思是“几乎总是”。

关于heap-memory - 直接堆栈和堆访问;虚拟级还是硬件级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27298414/

相关文章:

java - 增加 Java 堆空间 : Eclipse vs. BAT 脚本

java - 如何确定各种Java 8堆内存名称?

java - 如何增加 eclipse 中的 jboss 内存堆大小

caching - 在处理器 x86/x86_64 中使用物理或虚拟寻址来缓存 L1、L2 和 L3?

arrays - 数组如何存储在堆栈中?

c# - CLR 如何访问 C# 堆栈?

c++ - 对堆的访问是否序列化?

c - 直接访问进程内存

c - 为什么这个内存吞噬者不真的吃内存?

java - 堆 vs 堆栈 vs 永久空间