[英]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.