c++ STL vector是realloc的更好版本吗?

8i9zcol2  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(124)

在C中,我相信,处理重新分配的更好方法是使用STL向量,因为它保证了连续的存储位置。
我有几个问题来理解两者的区别:
1.在任何情况下,我需要优先选择realloc而不是vector吗?
1.在C
中,除了vector,还有什么东西等价于realloc吗?

ulmd4ohb

ulmd4ohb1#

C函数集(malloc,calloc,realloc,free)是原始内存操作。它们将在内存中创建/修改/释放给定的缓冲区,但内存将没有类型,也不会调用构造函数。
C没有 realloc 的等价物,而只有通过使用 new/new[]delete/delete[] 与malloc/free的类型安全等价物。C版本将从系统获取内存 * 并通过调用适当的构造函数来初始化它。使用 delete 将调用对象的析构函数,然后释放内存。C和C版本不兼容,如果你用 malloc 获取内存(即使你在接收到的内存上调用inplace构造函数),你也不能用 delete/delete[] 释放它,因为它是未定义的行为。
在C
中使用 realloc 可能是不安全的,因为它会将对象从一个内存区域按位复制到下一个。(假设你的对象既有一个属性又有一个对它的引用,在按位移动它之后,引用将指向旧的位置而不是真实的属性)在 vector 内部,每当内存需要增长时,使用 new[] 获取新的内存区域,然后在删除旧元素之前,使用适当的C++操作将所有对象复制到(或复制构造在)新位置。
vector 的大小增加时(保留大小,未使用的大小),它将创建一个完整的新内存区域并 * 移动 * 所有对象。另一方面,realloc只会在指针后没有足够的连续空间时将内存块移动到另一个位置。Vectors 不会减小大小。永远不会。当您清除元素时,保留的内存仍然保留。
最后,vector 比realloc有更高的抽象层次,即使对于POD类型(可以安全地使用类似C的结构移动)。vector 的等价物是一个结构体,它保存内存缓冲区的指针,已使用的元素计数和保留的(缓冲区大小)以及一组函数,这些函数处理根据需要获取更多内存并在每次操作时更新索引。

kr98yfug

kr98yfug2#

连续内存也是由realloc保证的,所以这不是不使用它的理由。
然而,我更喜欢在C++中使用向量,因为它处于更高的抽象级别,因此它使代码更容易编写。
我认为在数组类型的场景中使用realloc(over vector)的唯一可能的原因是原始速度。它 * 可能 * 更快。我强调“可能”这个词- * 测量,不要猜测!*
然而,你必须处理你自己的重新分配,这是更多的工作。我宁愿有代码运行慢一点(当然,假设它仍然运行得足够快),如果我可以交付它,并得到报酬更快。

rvpgvaaj

rvpgvaaj3#

std::vector的一个主要好处是,当它从自然增长中重新分配自己时,它会选择一个比当前大小大2倍的大小(通常-但总是一个常数乘数)。这意味着push_back的摊销成本为O(1)。
Realloc会让你给予更好的控制如何分配内存,但是能力越大,责任越大。如果你所做的就是相当于push_back,并且每次添加一个元素时都要重新分配内存,那么每次添加到数组中的操作都可能是O(N)的。

bwitn5fc

bwitn5fc4#

我想这只是一个矢量。
我还没有看到有人建议在C++中使用realloc。

ubby3x7f

ubby3x7f5#

只有vector保证有连续的内存,其他的没有。
realloc是一个C内存管理函数。在C代码中不鼓励使用它。下面是Stroustrup告诉你的原因:为什么C没有一个等价的realloc()?
然而,realloc()只能保证对malloc()(和类似的函数)分配的数组有效,这些数组包含没有用户定义的复制构造函数的对象。另外,请记住,与天真的期望相反,realloc()偶尔会复制其参数数组。

相关问题