代码之家  ›  专栏  ›  技术社区  ›  aJ.

stl vector是realloc的更好版本吗?

  •  6
  • aJ.  · 技术社区  · 15 年前

    在C++中,我相信,处理重分配的一个更好的方法是使用STL向量,因为它保证了连续的存储位置。

    我有几个问题来理解不同之处:

    1. 有什么我需要喜欢的场景吗 realloc 过向量?
    2. 有没有其他(除了向量)等价于 雷洛克 在C++中?

    谢谢,

    5 回复  |  直到 7 年前
        1
  •  14
  •   Ben Hymers    10 年前

    它只是 vector ,保证有连续的内存。不是其他的。

    realloc 是C内存管理功能。它的使用在C++代码中是不被鼓励的。这是斯特劳斯鲁告诉你原因: Why doesn't C++ have an equivalent to realloc()?

    但是,realloc()只保证在malloc()(和类似函数)分配的数组上工作,这些数组包含没有用户定义的复制构造函数的对象。另外,请记住,与幼稚的期望相反,realloc()偶尔会复制其参数数组。

        2
  •  10
  •   David Rodríguez - dribeas    15 年前

    C函数集(malloc、calloc、realloc、free)是原始内存操作。它们将在内存中创建/修改/释放给定的缓冲区,但内存将没有类型,也不会调用任何构造函数。

    C++没有等价的 雷洛克 ,但通过使用 新的[新的] 删除/删除[] . C++版本都将从系统中获取内存。 通过调用适当的构造函数初始化它。使用 删除 将调用对象的析构函数,然后释放内存。C和C++版本是不兼容的,如果您获得内存 马洛克 (即使调用接收内存上的inplace构造函数)也不能用 删除/删除[] 因为这是未定义的行为。

    使用 雷洛克 在C++中可能是不安全的,因为它将按位将对象从一个内存区复制到下一个内存区。有时,对象无法正确处理内存移动(例如,对象同时具有属性和对它的引用,按位移动后,引用将指向旧位置,而不是实际属性)。内部 矢量 ,每当内存需要增长时,都会使用 新[ ] 然后所有对象在删除旧元素之前,使用适当的C++操作在新位置复制(或复制构建)。

    无论何时 矢量 它将创建一个完整的新内存区域,并且 移动 所有对象。另一方面,如果指针指向 成长 它。 向量 不要减小尺寸。从未。清除元素时,保留的内存仍然保留。

    最后,在 矢量 甚至对于pod类型(使用C-like结构可以安全地移动)来说,也是如此。相当于 矢量 将是一个结构,其中包含指向内存缓冲区的指针、已用元素计数和保留(缓冲区大小)以及一组函数,这些函数用于根据需要获取更多内存并用每个操作更新索引。

        3
  •  8
  •   paxdiablo    7 年前

    连续内存也由realloc来保证,所以这不是不使用它的原因。

    但是,我更喜欢在C++中使用向量,因为它处于更高的抽象级别,因此它使代码更易于编写。

    我能想到将realloc(over vector)用于数组类型场景的唯一可能原因是原始速度。它 可以 快一点。我强调“可能”- 测量,不要猜测!

    然而,你必须处理自己的重新分配,这是更多的工作。我宁愿让代码运行得慢一点(当然,假设它仍然运行得足够快),如果我能更快地交付它并获得报酬的话。

        4
  •  5
  •   Greg Rogers    15 年前

    std::vector的一个主要好处是,当它从自然增长的内部重新分配自己时,它选择一个比当前大小大2倍的大小(通常-但始终是一个常量乘数)。这意味着“推回”已经摊销了O(1)成本。

    realloc会让你更好地控制你如何分配内存,但是有了强大的力量,责任就来了。如果您所做的一切相当于推回,并且每次添加元素时都会重新分配,也就是说 潜在地 对数组的每一个加法进行O(N)操作。

        5
  •  1
  •   Shree    15 年前

    我想它只是一个向量。

    我没有见过任何人建议在C++中使用RealLoc。