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

Ali*_*tan 6 c++ memory-management allocation vector

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

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

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

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

  3. 是否还有其他更微妙的原因导致这种情况没有发生?

Fab*_*ssi 3

它是第 2) 点和第 3) 点的结合。

首先,人们推断(我不能说当时做了多少测量)好处很少而且不是那么大。您只能(显着)增加内存,前提是在原始分配之后没有发生分配,并且增加向量的成本被摊销。

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

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