代码之家  ›  专栏  ›  技术社区  ›  Imagist

如何在C和C++中分配和释放*数组*内存?

  •  4
  • Imagist  · 技术社区  · 16 年前

    我的问题是关于数组, 物体。

    关于这个有几个问题 malloc() / free() 对战 new / delete 但所有这些都集中在如何使用它们的差异上。我理解它们是如何被使用的,但我不理解是什么潜在的差异导致了使用上的差异。

    我经常听到C程序员这样说 马尔洛() 自由() 是昂贵的操作,但我从来没有听说过C++程序员这样说 新的 删除 . 我还注意到C++没有一个对应于C的操作。 realloc() .

    如果我写一个等价于C++的 vector 类,我希望在调整数组大小时避免复制整个数组,但使用 新的 删除 你必须复制。在C语言中,我会简单地 RealLoad() . 值得注意的是 RealLoad() 可能只是复制整个数组,但我的印象是它使用了相同的指针,并且为它分配了更少的空间,至少在向下调整大小时是这样。

    所以我的问题是 马尔洛() 自由() 不同于 新的 删除 .更具体地说,为什么C方式有一个更昂贵的耻辱,为什么C++模式不允许复制而调整大小呢?

    6 回复  |  直到 14 年前
        1
  •  5
  •   RichieHindle    16 年前

    在引擎盖下没有真正的区别-通常是默认的 new delete 操作员只需呼叫 malloc free .

    至于“更贵的耻辱”,我的理论是:回到一天,每一个周期都计算在内,所花费的时间 马洛克 在很多情况下都非常重要。但是到了C++出现的时候,硬件的速度要快得多,自由商店管理者所花费的时间也不那么重要。重点是从机器资源的有效利用转向程序员资源的有效利用。

    为什么C++缺少 realloc 相当,我不知道。

        2
  •  2
  •   sharptooth    16 年前

    通常,new和delete使用malloc()和free()进行内存分配/释放。无论如何,它们必须使用一些原语进行内存分配/释放-使用重载 新的 删除 可以比malloc()和free()更快的运算符(比如它可以是在固定大小对象的内存池中工作的函数)。通常,除非您已经实际完成了这样的重载,否则您将看不到以这些方式完成的内存分配成本的任何差异。

    不允许重新分配,因为并非所有数据类型都允许在内存中移动-它们需要调用复制构造函数和析构函数才能正确移动。例如,您可能在数组中存储了一些图形节点结构。如果盲目移动它们,指向对象之间的指针将变为无效。

        3
  •  1
  •   anon    16 年前

    “新建和删除操作成本高昂”—现在,您已经 听说过C++程序员说的。但是说真的,动态内存分配在两种语言中的开销是一样的。

        4
  •  1
  •   moogs    16 年前

    我不知道C“耻辱”,但调整大小的C++。可以使用Placement New自定义New的行为。

    但为什么要这样做呢?让编译器制造商做他们最擅长的事情!

        5
  •  1
  •   WillW    16 年前

    总的来说,传统上,C被用于资源受限的环境中,这不仅是因为它存在的时间更长,而且因为它被用于嵌入式应用程序。潜在的计算成本 malloc 因此,这是一个担忧,而C++在PC机上更常用,不必太担心。

    new delete 很可能由编译器以与malloc非常相似的方式实现,但是它们有一个区别(这就是它们存在的原因)——它们调用相关项的构造函数和析构函数。

    当我说constructor时,我当然是指任何所需的初始化(填写vtables、设置初始化器等)。这可能使 新的 删除 更慢,但在并行比较中(分配和释放 int 例如)没有根本的区别。

        6
  •  0
  •   David Cournapeau    16 年前

    它们基本上使用相同的分配技术——当然,在大多数实现中,默认的C++运行时新不会比Maloc快得多。最大的区别之一是,你可以在C++中改写分配器,这样你就可以使用优化的分配器来优化你的预期内存行为——当然,你也可以在C中这样做,但是语法上有点麻烦。