1
14
它只是
|
2
10
C函数集(malloc、calloc、realloc、free)是原始内存操作。它们将在内存中创建/修改/释放给定的缓冲区,但内存将没有类型,也不会调用任何构造函数。 C++没有等价的 雷洛克 ,但通过使用 新的[新的] 和 删除/删除[] . C++版本都将从系统中获取内存。 和 通过调用适当的构造函数初始化它。使用 删除 将调用对象的析构函数,然后释放内存。C和C++版本是不兼容的,如果您获得内存 马洛克 (即使调用接收内存上的inplace构造函数)也不能用 删除/删除[] 因为这是未定义的行为。 使用 雷洛克 在C++中可能是不安全的,因为它将按位将对象从一个内存区复制到下一个内存区。有时,对象无法正确处理内存移动(例如,对象同时具有属性和对它的引用,按位移动后,引用将指向旧位置,而不是实际属性)。内部 矢量 ,每当内存需要增长时,都会使用 新[ ] 然后所有对象在删除旧元素之前,使用适当的C++操作在新位置复制(或复制构建)。 无论何时 矢量 它将创建一个完整的新内存区域,并且 移动 所有对象。另一方面,如果指针指向 成长 它。 向量 不要减小尺寸。从未。清除元素时,保留的内存仍然保留。 最后,在 矢量 甚至对于pod类型(使用C-like结构可以安全地移动)来说,也是如此。相当于 矢量 将是一个结构,其中包含指向内存缓冲区的指针、已用元素计数和保留(缓冲区大小)以及一组函数,这些函数用于根据需要获取更多内存并用每个操作更新索引。 |
3
8
连续内存也由realloc来保证,所以这不是不使用它的原因。 但是,我更喜欢在C++中使用向量,因为它处于更高的抽象级别,因此它使代码更易于编写。 我能想到将realloc(over vector)用于数组类型场景的唯一可能原因是原始速度。它 可以 快一点。我强调“可能”- 测量,不要猜测! 然而,你必须处理自己的重新分配,这是更多的工作。我宁愿让代码运行得慢一点(当然,假设它仍然运行得足够快),如果我能更快地交付它并获得报酬的话。 |
4
5
std::vector的一个主要好处是,当它从自然增长的内部重新分配自己时,它选择一个比当前大小大2倍的大小(通常-但始终是一个常量乘数)。这意味着“推回”已经摊销了O(1)成本。 realloc会让你更好地控制你如何分配内存,但是有了强大的力量,责任就来了。如果您所做的一切相当于推回,并且每次添加元素时都会重新分配,也就是说 潜在地 对数组的每一个加法进行O(N)操作。 |
5
1
我想它只是一个向量。 我没有见过任何人建议在C++中使用RealLoc。 |
Julia · 矢量中相加为总和S的值的数量 1 年前 |
C_Rod · 在模板方法中确定STL容器中项目的数据类型 2 年前 |
quantumwell · 将空向量放入std::map() 6 年前 |
OutOfBound · 对未初始化内存使用算法的优点 6 年前 |
DarthRubik · 在使用列表删除之后,迭代器如何不无效 6 年前 |