我刚刚在Stack Overflow(以及通过Google找到的其他随机网站)上经历了一堆堆栈线程与堆线程,但是我找不到一个能够提供足够多(如果有的话)深度的读写速度问题的答案。 (大多数答案和文章都关注分配速度)。
如果我正在编写将对象数据存储在大小为几千字节的缓冲区中的C程序(在我的情况下为游戏),那么在分配该缓冲区的情况下(在访问速度方面)会有所不同在堆栈还是堆上?还是在决定在硬件(即高速缓存或RAM)上的哪个位置存储时,编译器会以相同的方式处理该大小的缓冲区吗?
最佳答案
在典型的现代CPU和OS上,不,基于缓冲区是堆还是堆栈,我不希望平均访问时间,高速缓存未命中的可能性或(更糟糕的)页面错误的可能性有任何不同。唯一重要的是与其他内存使用方式相比,您的访问方式。但是,可能存在嵌入式平台或专用平台,在这些平台中,堆栈被保存在与堆不同的内存中。
您将忽略第三种可能性,非堆内存(通过某些特定于操作系统的调用(例如mmap
而不是malloc
)分配)。
最后,如果您想完全消除页面错误的可能性,则OS可能会提供一种解决方法。例如POSIX上的mlock
。