我刚刚在Stack Overflow(以及通过Google找到的其他随机网站)上查看了一堆堆栈与堆线程,但我找不到能够为读取问题提供更多(如果有)深度的答案/写入速度(大多数答案和文章都关注分配速度)。
如果我正在编写一个C程序(在我的情况下是一个游戏),我将对象数据存储在一个几千字节的缓冲区中,它是否会产生差异(就访问速度而言)缓冲区是在堆栈上还是在堆上分配的?或者,在决定存储它的硬件(即缓存或RAM)的位置时,编译器是否会以相同的方式处理该大小的缓冲区?
答案 0 :(得分:5)
在典型的现代CPU和操作系统上,不,我不会期望平均访问时间,缓存未命中的可能性或(更糟糕的)基于缓冲区是否在堆中的页面错误的可能性有任何差异堆。与其他内存使用相比,唯一重要的是您访问它的模式。但是,可能存在嵌入式或专用平台,其中堆栈保存在与堆不同的内存中。
您忽略了第三种可能性,非堆内存(由某些特定于操作系统的调用分配,例如mmap
,而不是malloc
)。
最后,如果您想彻底消除页面错误的可能性,操作系统可能会提供一种方法来执行此操作;例如,POSIX上的mlock
。
答案 1 :(得分:4)
访问速度没有区别,毕竟它的内存相同。编译器永远不会决定应该在哪里存储缓冲区物理。它是硬件和操作系统业务。
答案 2 :(得分:2)
一点也不。 heap
广告stack
是虚拟地址空间中操作系统为您的应用提供的区域。它们的区别在于您的应用在stack
中存储的内容以及heap
中的内容。所有引用类型都存储在heap
中,所有值类型都存储在stack
中。此外,stack
中存储的内容的生命周期与应用的生命周期相同,而存储在heap
中的类型可能会被垃圾收集,并且它们使用的内存将被回收