我知道,由于必要的内存管理(分配、去分配),使用堆对象要慢一些。那访问他们呢?访问堆栈上的对象与堆上的对象时是否存在性能差异?
编辑:,我的问题是not about allocation
,但是访问它们。这包括堆栈与堆的内存位置、缓存丢失或任何其他我不知道的变量。下面是一个简单的玩具示例:
int stack_array[100];
int* heap_array = new int[100];
...
...
std::cout << stack_array[51]; // Any difference between these two statements
std::cout << heap_array[51]; // Any difference between these two statements
发布于 2015-07-01 22:18:10
除非物理内存不同,否则您可能不会注意到堆栈和堆(动态内存)之间的速度差异。
无论内存位置如何,数组的访问都是直接的。您可以通过查看编译器生成的汇编语言来确认这一点。
如果操作系统决定为您的数组使用虚拟内存,则可能存在差异。这意味着操作系统可以将数组的块页到硬盘驱动器,并根据需要将它们交换出去。
在大多数应用程序中,如果内存类型之间存在物理差异(就速度而言),则可以忽略不计,按纳秒顺序排列。对于更多的计算密集型应用程序(大量数据或速度需要),这可能会产生不同的效果。
但是,还有其他问题使内存访问成为非问题,例如:
上述所有项目的开销通常比对内存设备的访问多一个数量级。
使用动态内存而不是基于堆栈的主要原因是大小。堆栈内存主要用于传递参数和存储返回地址。未声明为静态的局部变量也将放置在堆栈上。大多数编程环境为堆栈区域提供了更小的大小。较大的项可以放在堆上或声明为静态项(并与globals放在同一区域)。
更担心的是正确性,而不是内存性能。怀疑时的侧写。
编辑1:缓存缺少
Cache小姐是当处理器在其数据缓存中查找而没有找到项时,处理器必须从外部内存(即.a)中获取该项。(重新加载缓存)。
对于大多数应用程序来说,缓存丢失在性能上可以忽略不计,通常以小纳秒值来衡量。除非您的程序是计算密集型的或处理大量数据,否则它们不会被注意到。
分支指令将占用比缓存丢失更多的执行时间。一些有条件的分支指令可能迫使处理器重新加载指令管道并重新加载程序计数器寄存器。(注意:一些处理器可以将可执行循环代码拖入指令缓存,并减少分支效应的惩罚。)
您可以组织数据以减少缓存丢失的数量。搜索网页中的“数据驱动”或“数据优化”。此外,还尝试通过应用代数、布尔代数和分解循环之外的不变量来减少分支。
https://stackoverflow.com/questions/31171756
复制相似问题