为什么编译器在向量满时不会尝试分配连续的内存(如果可能)?

时间:2016-04-28 22:50:59

标签: c++ memory-management vector allocation

std::vector变满时,会分配新内存。根据我的阅读,新容量以几何级数增长(但这与问题无关),然后旧信息被复制到新的内存区域,旧的信息被释放。

基于这个假设,我的问题是:

  1. 为什么编译器不会在我们std::vector的末尾试图查看是否有足够的连续免费使用内存,只在我们std::vector的末尾分配一部分,并且不要浪费时间复制?

  2. 人们是否试图实现这一点,但是决定不值得这样做? (平均/总是)

  3. 为什么没有发生这种情况还有其他更微妙的原因吗?

1 个答案:

答案 0 :(得分:3)

这是你的观点2)和3)的组合。

首先,它被推理(我不能说当时做了多少测量),这种好处很少见,也不那么好。如果在原始分配后没有发生分配,你只能(显着)增加记忆,并且生长一个向量的成本是摊销的。

然而,许多人指出即使这种情况也不是那么罕见,并且可以显着提高性能并防止内存碎片化。所以有一个proposal in 2006

这是更微妙的原因。 第一个问题是容器不会自己分配内存,而是使用分配器来执行此操作。因此,作为第一步,需要更改分配器接口。这很难,因为正如其他人所指出的那样,只有在所包含的类型是微不足道的情况下才能使用realloc。为了普遍有用,我们需要一个不同的低级函数来增长内存(只有在可以在内部完成时才重新分配,有关详细信息,请参阅提案)。 问题在于并非所有平台都提供这样的功能,因此我们需要Posix或C标准首先提供。