1

众所周知:

ptr = malloc(size);

或在 C++ 中

ptr = new Klass();

将在堆上分配 size 个字节。它的效率低于堆栈。

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

foo(*ptr);

或者

(*ptr)++;

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

4

4 回答 4

2

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

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

于 2013-08-22T17:10:07.373 回答
1

这真的取决于你在比较什么以及如何比较。

如果你的意思是

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

慢于:

int arr[10]
ptr = arr; 

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

那就不要。

如果您指arr[0]的是在第二种情况下使用而不是*ptr,则可能是因为编译器必须读取值ptr才能找到实际变量的地址。然而,在许多情况下,它会“知道” 内部的值ptr,因此不需要读取指针本身。

如果我们进行比较foo(ptr)foo(arr)它根本不会有任何区别。

[在堆上实际分配可能会有一些惩罚,因为在第一次使用时必须“提交”内存。但这对于每 4KB 最多一次,在大多数情况下我们可能会忽略它]。

于 2013-08-22T16:46:47.617 回答
0

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

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

但是,如果您正在为经常调用的内核编写一些代码,那么很小的差异可能会变得可测量。

在这个问题的上下文中,真正的答案是真的没关系,使用任何存储使您的程序易于阅读和维护。因为,从长远来看,支付人工阅读代码的成本比运行 CPU 执行更多/或更少指令的成本要高。

于 2013-08-22T21:45:06.190 回答
-2

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

于 2013-08-22T17:31:11.817 回答