C++ 总是推荐std::vector而不是realloc公平吗?
发件人:C++ 总是推荐std::vector而不是realloc公平吗?,c++,realloc,C++,Realloc,发件人: 如果你觉得需要RealLoor(),那么很多人都会考虑使用 标准库向量 在我的问题开始之前,我同意由于许多原因,std::vector更好,我个人总是选择使用它,而不是使用C内存分配编写自己的动态数组 < > >代码> STD::向量随着它的增长,碎片内存,因为C++没有等同于 ReLoC/(edit为了澄清,我知道std::vector的存储是连续的,不会碎片化,我指的是分配和解除分配导致的内存空间碎片化,realloc可以通过扩展现有分配来避免)那么,总是推荐它而不是realloc
如果你觉得需要RealLoor(),那么很多人都会考虑使用 标准库向量
在我的问题开始之前,我同意由于许多原因,std::vector
更好,我个人总是选择使用它,而不是使用C内存分配编写自己的动态数组
< > >代码> STD::向量随着它的增长,碎片内存,因为C++没有等同于<代码> ReLoC/(edit为了澄清,我知道std::vector
的存储是连续的,不会碎片化,我指的是分配和解除分配导致的内存空间碎片化,realloc
可以通过扩展现有分配来避免)那么,总是推荐它而不是realloc
,这公平吗?你能不能非常小心地编写一些类似于std::vector
的东西,但使用C分配函数,它可以在不移动地址和复制现有元素的情况下增加内存,从而使其在碎片方面同样好或更好还有表演
<>和相关(奖金问题),为什么C++没有等价于<代码> ReLoC/?在一个如此专注于性能的语言中省略似乎是一件奇怪的事情。,但答案并没有提到“为什么”。这只是一个偶然的遗漏吗?是否与new
/delete
的工作方式存在一些根本性的不兼容?它是否真的没有带来实践中似乎带来的好处
<> > >编辑< <强>:好吧,我忽略了deterministic mem.-move
源于deterministic capacity/grow
。当realloc
和std::vector
必须将其存储的元素移动到新的内存位置时
我认为,当你考虑任何类型的移动(智能)引用时,关于记忆移动的(决定的)决定论是双重重要的。
注意:在这方面,我使用术语“确定性”来描述我的源代码生命周期,即它在不同版本的不同库中的生命周期,具有不同的编译标志,等等
来源 它对内存的碎片化程度不亚于
realloc
对内存的碎片化程度:
类模板向量概述[向量.概述]
a的要素
向量是连续存储的,这意味着如果v
是vector
,其中T
是bool
以外的某种类型,那么它服从所有0的标识&v[n]==&v[0]+n
<代码>代码STD::向量随着它的增长,片段内存,因为C++没有等同于<代码> ReLoC/ > < /P>
realloc
将以相同的方式分割内存,因为它执行相同的操作-分配新块并复制内容(如果旧块不够大)
您能否非常小心地编写一些类似于std::vector的东西,但使用C分配函数,它可以在不移动地址和复制现有元素的情况下增加内存,从而使其在碎片和性能方面同样好或更好
这正是vector
所做的。您可以独立于大小来控制容量,并且只有在超过容量时才会重新分配。realloc
类似,但无法控制容量,从而使vector
在碎片和性能方面变得更好
<>为什么C++没有等价于代码> ReLoCu?< /P>
因为它有<代码> STD::vector < /C>,它具有更大的灵活性。同时,允许你精确地控制内存分配的方式和时间,它可以与任何可移动类型一起工作,而<>代码> ReLoC/在非平凡类型中使用时会出错。
< P>有一个很好的原因,为什么C++没有<代码>
;我不再重复,而是让您找到答案
作为记录,一个适当的
向量实现在某种程度上缓解了碎片问题,因此它并不是一个完全失败的原因。new
/new[]
和delete
/delete[]
通常是在C库分配函数的顶部(alamalloc
/realloc
/free
)可能有一个额外的小对象优化层,使用一个代码> Malc C/代码> -ED区域,以快速满足许多小<代码>新< /COD>请求。这个分层意味着支持<代码>新< /COD>和 Debug >在早期C++库作者的部分中很少执行。
在C++中使用“代码修改> RealCalc/Cuth>中的就位调整功能,但是,需要对代码< RealCult库函数进行入侵更改,这样如果需要移动到新的内存区域,C++库代码就有机会复制/破坏被移动的对象。
<> L> > P> >在代码> ReLoCu之后发生的回调,需要一个动作,要求C++库执行实际的数据移动,而不是做<代码> MycPyIE()//Cype风格的字节复制,或者
- 作为一个额外的调整到位或失败没有mo
| std::vector | C memory functions
------------------------+------------------+------------------------
default capacity | undefined | undefined
default grow | towards capacity | undefined
deterministic capacity | available | no
deterministic grow | available | no
deterministic mem.-move | available | no
non-POD types | yes | f***ing no (*)
no-throw | no | yes
std::vector<T> vec(32);
vec.reserve(1024);
// vec has size 32, but reserved a memory region of 1024 elements