C++ 多次分配内存是否一次性花费更多时间?

C++ 多次分配内存是否一次性花费更多时间?,c++,C++,众所周知,序列容器(列表除外)的容量是在将推回到其容量等于其大小的容器后定义的实现 大多数编辑者会保留更多的内存,而不仅仅是多分配一个大小,并保持容量与大小相等 所以我认为分配多次将需要更多的时间。但是除了检查bad\u alloc,还有其他原因吗?让我们以std::vector为例。如果每次只分配少量内存,则会出现两个主要问题: 分配之后通常会复制容器中的值。如果存在大量数据,或者值类型具有昂贵的复制(或移动)构造函数,则这可能非常昂贵 较小的分配可能会增加堆碎片,并且肯定会增加堆簿记开销。除

众所周知,序列容器(列表除外)的容量是在将
推回
到其
容量等于其
大小的容器后定义的实现

大多数编辑者会保留更多的内存,而不仅仅是多分配一个大小,并保持容量与大小相等


所以我认为分配多次将需要更多的时间。但是除了检查
bad\u alloc
,还有其他原因吗?

让我们以
std::vector
为例。如果每次只分配少量内存,则会出现两个主要问题:

  • 分配之后通常会复制容器中的值。如果存在大量数据,或者值类型具有昂贵的复制(或移动)构造函数,则这可能非常昂贵

  • 较小的分配可能会增加堆碎片,并且肯定会增加堆簿记开销。除了可变成本(与分配规模成比例)外,每个分配都有固定成本


  • 为了简化对实际问题的识别,请少用“?”。@第一个语句本身似乎很自信。后面需要问号吗?很有趣。但我还是拿不到第一件东西。为什么它与复制/移动时间有关?我认为对这些构造函数的调用次数是相同的。@构造函数:对于
    std::vector
    ,每次分配内存时都必须复制所有元素,因为分配是针对整个向量的。因此,如果您将10个元素分块分配,并在末尾重复插入值,那么在插入第41个元素时,您将复制所有10个、20个、30个、40个元素。每次重新分配时都会复制第一个元素。