【问题标题】:Does allocation on the heap affect the access performance?堆上的分配会影响访问性能吗?
【发布时间】:2013-08-22 16:37:24
【问题描述】:

众所周知:

ptr = malloc(size);

或在 C++ 中

ptr = new Klass();

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

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

foo(*ptr);

(*ptr)++;

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

【问题讨论】:

  • 我认为它在实践中没有显着差异。

标签: c++ c memory memory-management resources


【解决方案1】:

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

即便如此,结果也仅适用于您的特定系统。

【讨论】:

    【解决方案2】:

    这实际上取决于您要比较的内容和方式。

    如果你的意思是

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

    慢于:

    int arr[10]
    ptr = arr; 
    

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

    然后没有。

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

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

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

    【讨论】:

    • 我的意思是,如:struct Bar bar 并使用foo(bar)struct Bar * bar = malloc(sizeof(struct Bar)) 并使用foo(*bar) 访问
    • 除了打电话给malloc,没有。 [当然还有随后对free的调用!]
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 你描述了分配和释放过程,但这个问题是关于访问已经分配的内存。
      猜你喜欢
      • 2012-06-25
      • 2016-02-03
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2012-02-04
      • 2011-01-28
      • 1970-01-01
      相关资源
      最近更新 更多