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
的工作方式存在一些根本性的不兼容?它是否真的没有带来实践中似乎带来的好处

<> > >编辑< <强>:好吧,我忽略了 ReloLC/ >代码> STD::vector 不能改写使用<代码> ReLoC/,因为它只与POD一起工作,不投掷等等。也许在某些情况下,只写一个POD容器来处理NASTY会是个好主意。然而,更有趣的问题变成:WixCux:STD::vector 受益于C++的等价于代码> ReLoCu,它(或多或少)在这里被回答:

不幸的是,答案似乎是“是的,但标准委员会没有投票”。希望如此。

直接比较
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库分配函数的顶部(ala
malloc
/
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