繁体   English   中英

堆上的分配是否会影响访问性能?

[英]Does allocation on the heap affect the access performance?

众所周知:

ptr = malloc(size);

或在C ++中

ptr = new Klass();

将在堆上分配大小字节。 它比堆栈上的效率低。

但是在分配之后,当我们访问它时:

foo(*ptr);

要么

(*ptr)++;

它与堆栈上的数据具有相同的性能还是更慢?

明确回答这个问题的唯一方法是对两个版本进行编码,并在多种情况下(不同的分配大小,不同的优化设置等)衡量它们的性能。 这种事情在很大程度上取决于许多不同的因素,例如优化设置,操作系统如何管理内存,分配的块的大小,访问的位置等。 永远不要盲目地认为一种方法更“有效”。在所有情况下都比另一个要好。

即使这样,结果也仅适用于您的特定系统。

这实际上取决于您正在比较什么以及如何进行比较。

如果你的意思是

ptr = malloc(10 * sizeof(int)); 

慢于:

int arr[10]
ptr = arr; 

然后使用ptr访问它指向的整数?

那就不要。

如果要在第二种情况下使用arr[0]而不是*ptr ,则可能是因为编译器必须读取ptr的值以查找实际变量的地址。 但是,在许多情况下,它将“知道” ptr的值,因此不需要自己读取指针。

如果我们要比较foo(ptr)foo(arr)那根本没有任何区别。

[在堆上实际分配可能会有一些损失,因为在第一次使用时必须“承诺”内存。 但这每4KB最多只能有一次,在大多数情况下,我们可能会忽略它。

在比较以O(n ^ 2)时间与O(nlogn)等时间运行的算法时,效率方面的考虑很重要。

比较存储器存储访问,两种算法为O(n)或O(k)和通常是不可能测量的任何差异。

但是,如果您正在为频繁调用的内核编写一些代码,则可能会有很小的差异。

在这个问题的上下文中,真正的答案是,这并不重要,无论使用哪种存储方式,都使您的程序易于阅读和维护。 因为,从长远来看,付出人工来阅读代码的代价要比运行cpu来获取更多(或更少)指令的成本高。

堆栈比堆快得多,因为它涉及到移动堆栈指针一样简单。 堆栈大小固定。 与堆相比,用户需要手动分配和取消分配内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM