是否更快地访问堆中的数据?

我知道这听起来像是一个普遍的问题而且我已经看过很多类似的问题(无论是在这里还是在网上),但它们都不是我的困境。

说我有这个代码:

void GetSomeData(char* buffer) { // put some data in buffer } int main() { char buffer[1024]; while(1) { GetSomeData(buffer); // do something with the data } return 0; } 

如果我在全局声明缓冲区[1024],我会获得任何性能吗?

我通过time命令在unix上运行了一些测试,执行时间之间几乎没有差异。

但我真的不相信……

理论上,这种变化应该有所作为吗?

是否更快地访问堆中的数据?

并非……在我曾经工作的每个架构上,所有进程“内存”都可以按照相同的速度运行,具体取决于哪个级别的CPU缓存/ RAM /交换文件保存当前数据,以及任何硬件级同步延迟该内存上的操作可能会触发使其对其他进程可见,并包含其他进程/ CPU(核心)的更改等。

操作系统(负责页面错误/交换)以及对已换出或尚未访问的页面的访问的硬件(CPU)陷阱甚至不会跟踪哪些页面是“堆栈”与“堆”。 ..内存页面是一个内存页面。 也就是说,全局数据的虚拟地址可以在编译时计算和硬编码,基于堆栈的数据的地址通常是堆栈指针相对的,而堆上的内存几乎总是必须使用指针访问,这可能是在一些系统上稍微慢一些 – 它取决于CPU寻址模式和周期,但它几乎总是微不足道 – 除非你写的是百万分之一秒钟非常重要的东西,否则它甚至不值得一看。

无论如何,在你的例子中,你将全局变量与函数本地(堆栈/自动)变量进行对比……没有涉及堆。 堆内存来自newmalloc / realloc 。 对于堆内存,值得注意的性能问题是应用程序本身正在跟踪在哪些地址中使用了多少内存 – 所有需要一些时间来更新的记录作为指向内存的指针由new / malloc / malloc realloc ,还有更多时间更新,因为指针是delete d或free d。

对于全局变量,内存分配可以在编译时有效地完成,而对于基于堆栈的变量,通常有一个堆栈指针,每次增加编译时计算的局部变量(和一些内务数据)的大小总和调用一个函数。 因此,当调用main()时,可能需要一些时间来修改堆栈指针,但是如果没有buffer则可能只是被不同的修改而不是修改,如果没有则修改,因此运行时性能没有区别一点都不

引自Jeff Hill的回答 :

堆栈更快,因为访问模式使得从中分配和释放内存变得微不足道(指针/整数简单地递增或递减),而堆在分配或免费中涉及更复杂的簿记。 此外,堆栈中的每个字节都经常被频繁地重用,这意味着它往往被映射到处理器的缓存,使其非常快。 堆的另一个性能影响是堆(主要是全局资源)通常必须是multithreading安全的,即每个分配和释放需要 – 通常 – 与程序中的“所有”其他堆访问同步。

在此处输入图像描述

你的问题没有真正的答案; 这取决于你还在做什么。 一般来说,大多数机器在整个过程中使用相同的“内存”结构,因此无论变量驻留在何处(堆,堆栈或全局内存),访问时间都是相同的。 另一方面,大多数现代机器具有分层内存结构,具有内存管道,多级缓存,主内存和虚拟内存。 根据先前在处理器上发生的事情,实际访问可能是这些中的任何一个(无论是堆,堆栈还是全局),并且这里的访问时间差别很大,如果内存是单个时钟如果系统必须转到磁盘上的虚拟内存,那么在管道中的正确位置,大约需要10毫秒。

在所有情况下,关键是地点。 如果访问“接近”之前的访问,则会极大地提高在更快的位置之一找到它的机会:例如,缓存。 在这方面,将较小的对象放在堆栈上可能会更快,因为当您访问函数的参数时,您可以访问堆栈内存(使用Intel 32位处理器,至少—使用设计更好的处理器,参数更可能在寄存器中)。 但是,当涉及arrays时,这可能不是问题。

在堆栈上分配缓冲区时,优化范围不是访问内存的成本,而是消除堆上通常非常昂贵的动态内存分配(堆栈缓冲区分配可以立即考虑,因为整个堆栈是在线程启动时分配的) 。

赋予在堆上声明的变量和变量数组更慢只是一个事实。 以这种方式思考;

全局创建的变量分配一次,并在程序结束后解除分配。 对于堆对象,每次运行函数时都必须在现场分配变量,并在函数末尾取消分配。

曾经尝试在函数中分配对象指针吗? 好吧,在函数退出之前更好地自由/删除它,你会发现你自己没有在解析器中被释放/删除的类对象中执行此操作。

当访问数组时它们都工作相同,内存块首先由sizeof(DataType)*元素分配。 以后可以通过 – >访问

 1 2 3 4 5 6 ^ entry point [0] ^ entry point [0]+3