众所周知:
ptr = malloc(size);
或在C ++中
ptr = new Klass();
将在堆上分配大小字节。它的效率低于堆栈效率。
但是在分配之后,当我们访问它时:
foo(*ptr);
或
(*ptr)++;
它与堆栈中的数据具有相同的性能,还是更慢?
答案 0 :(得分:2)
明确回答此问题的唯一方法是对两个版本进行编码并在多种情况下衡量其性能(不同的分配大小,不同的优化设置等)。这类事情在很大程度上取决于不同因素的 lot ,例如优化设置,操作系统如何管理内存,分配块的大小,访问的位置等。从不盲目地假设一种方法在所有情况下都比另一种方法更“有效”。
即使这样,结果也只适用于您的特定系统。
答案 1 :(得分:1)
这取决于你的比较和方式。
如果你的意思是
ptr = malloc(10 * sizeof(int));
慢于:
int arr[10]
ptr = arr;
然后使用ptr
访问它指向的整数?
然后没有。
如果您指的是在第二种情况下使用arr[0]
而不是*ptr
,可能是因为编译器必须读取ptr
中的值才能找到实际变量的地址。但是,在许多情况下,它会“知道”ptr
内的值,因此不需要读取指针本身。
如果我们要比较foo(ptr)
和foo(arr)
,那么它将完全没有任何区别。
[在堆上实际分配可能会有一些损失,因为内存必须在第一次使用时“提交”。但是对于每个4KB,最多只有一次,在大多数情况下我们可能会忽略它。
答案 2 :(得分:0)
在比较在O(n ^ 2)时间与O(nlogn)等运行的算法时,效率考虑很重要。
比较内存存储访问,两种算法都是O(n)或O(k),并且通常 NOT 可以衡量任何差异。
但是,如果您正在为经常调用的内核编写一些代码,那么小的差异可能会变得可测量。
在这个问题的背景下,真正的答案是,它确实无关紧要,使用任何存储使您的程序易于阅读和维护。因为从长远来看,支付人类阅读代码的成本高于运行cpu以获得更多/更少指令的成本。
答案 3 :(得分:-2)
Stack比Heap快得多,因为它涉及移动堆栈指针这么简单。堆栈是固定大小的。与Heap相比,用户需要手动分配和取消分配内存。