dir*_*tly 15
它只是vector,保证有连续的记忆.不是其他人.
realloc是一个C内存管理功能.在C++代码中不鼓励使用它.这是Stroustrup告诉你原因:为什么C++没有与realloc()相同的东西?
但是,realloc()仅保证对包含没有用户定义的副本构造函数的对象的malloc()(和类似函数)分配的数组起作用.此外,请记住,与天真的期望相反,realloc()偶尔会复制其参数数组.
Dav*_*eas 10
C函数集(malloc,calloc,realloc,free)是原始内存操作.它们将在内存中创建/修改/释放给定的缓冲区,但内存将没有类型,也不会调用构造函数.
C++没有等效的realloc,但只有malloc/free的类型安全等价物通过使用new/new []和delete/delete [].C++版本将从系统获取内存并通过调用适当的构造函数对其进行初始化.使用delete将调用对象的析构函数,然后释放内存.C和C++版本不兼容,如果你使用malloc获取内存(即使你在接收的内存上调用inplace构造函数),你也无法使用delete/delete []释放它,因为它是未定义的行为.
在C++中使用realloc可能不安全,因为它会将对象从一个内存区域按位复制到下一个内存区域.有时你的对象不能正确处理内存移动(比如说你的对象有一个属性和对它的引用,在按位移动它之后,引用将指向旧位置而不是真实属性).在内部向量中,每当内存需要增长时,使用new []获取新内存,然后在删除旧元素之前使用适当的C++操作在新位置复制(或复制构造)所有对象.
每当向量增长(保留大小,未使用大小)时,它将创建一个完整的新内存区域并移动所有对象.另一方面,如果指针只是在增长之后没有足够的连续空间,则realloc只会将内存块移动到另一个位置.矢量不会减小尺寸.决不.清除元素时,仍保留保留的内存.
最后,即使对于POD类型(可以安全地使用类C结构移动),向量中的抽象级别也比realloc 级别高.等效于向量的结构是保存指向内存缓冲区的指针,使用的元素计数和保留(缓冲区大小)以及处理根据需要获取更多内存并使用每个操作更新索引的函数集.
realloc也保证了连续内存,因此不是不使用它的理由.
但是,我更喜欢在C++中使用向量,因为它处于更高的抽象级别,因此它使代码更容易编写.
我可以考虑使用realloc(over vector)进行数组类型场景的唯一可能原因是原始速度.它可能会更快.我强调"可能"这个词 - 衡量,不要猜!
但是,您必须处理自己的重新分配,这是更多的工作.我宁愿让代码运行得慢一点(假设它仍然运行得足够快,当然),如果我可以提供它并获得更快的报酬.
std :: vector的主要好处之一是当它从内部重新分配自然生长时,它选择的大小比当前大小大2倍(通常 - 但总是一个常数乘数).这意味着push_back已经摊销了O(1)成本.
Realloc将让您更好地控制如何分配内存,但强大的功能带来了巨大的责任.如果您所做的只是push_back,并且每次添加元素时都重新分配,那么在每次添加数组时都可能执行O(N)操作.