Preformance of realloc
Preformance of realloc
看起来realloc
不释放旧内存(无论成功还是失败),而vector
总是删除旧内存并分配新块。
对于POD数据,我是否可以说realloc
的性能优于vector
?
int *p = malloc(5 * sizeof(int));
...
int *new_p = (int*) realloc(p, 10 * sizeof(int));
旧的内存p
会在这里被释放吗?
Realloc可能会扩展实际分配(如果可能的话),或者可能会分配一个新的块,复制旧的块值并释放旧的块。在第一种情况下,它有更好的性能,但是,由于您事先不知道它要做什么,您必须假设指向旧块的指针将无效。
唯一显著的区别(忽略"语法糖")是realloc()
可能会尝试增加现有区域的大小;vector不能这样做,因此必须分配一个新区域,将旧数据复制到新区域,然后释放旧区域。
基于此,有2种情况realloc()
更优。第一种是当数据很大时(因此复制所有数据的成本很高),并且能够增加区域的大小以避免昂贵的复制。
第二种情况是您没有足够的(虚拟)内存来允许同时存在2个副本。例如,如果您在一台32位计算机上,有2gib的可用空间用于数据,并且您有一个1.5 GiB的数组,那么您无法分配第二个1.5 GiB的数组(空间不够),必须扩展现有区域或失败。
请注意,对于这两种情况(这是相对罕见的),realloc()
和向量可能都不如其他方法。举个简单的例子,而不是拥有一个巨大的数组,也许你可以把它分解成一个"子数组"的链表(例如,1000个"子数组"的链表,每个1.5 MiB而不是一个1.5 GiB的数组;这样就很容易创建一个新的"子数组"并将其添加到列表的末尾)。当然,其他方法也有缺点(例如,对于"子数组的链表"示例,迭代变得稍微复杂一些)。
相关文章:
- Usages of std::move
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 具有变量Number of Arguments的std::函数的矢量
- Capacity of a deque
- Deprecation of _writeBarrier()
- constexpr begin of a std::array
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- C++ "error: invalid use of void expression"
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 赛通"Cannot take address of memoryview slice"
- C++ Version Of Double.longBitsToDouble
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++ Usage of AsyncCallback
- 错误:"Left of getValue must have class/struct/union"
- Centos7 g++ "to_string is not in a member of std"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 传递 std::vector of std::shared_ptr,而不是更新对象
- libvlc-qt realloc error executing example program of libvlc-
- Preformance of realloc