众所周知:
ptr = malloc(size);
或在 C++ 中
ptr = new Klass();
将在堆上分配 size 个字节。它的效率低于堆栈。
但是在分配之后,当我们访问它时:
foo(*ptr);
或者
(*ptr)++;
它是否具有与堆栈上的数据相同的性能,还是更慢?
众所周知:
ptr = malloc(size);
或在 C++ 中
ptr = new Klass();
将在堆上分配 size 个字节。它的效率低于堆栈。
但是在分配之后,当我们访问它时:
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 执行更多/或更少指令的成本要高。
Stack 比 Heap 快得多,因为它涉及到像移动堆栈指针一样简单。堆栈是固定大小的。与堆相比,用户需要手动分配和取消分配内存。