为什么编译器在 vector 已满时不尝试分配连续内存(如果可能)?
Why don't compilers try to allocate contiguous memory (if possible) when vector is full?
当std::vector
满时,分配新的内存。从我读到的,新容量呈几何级数增长(但这与问题无关),然后旧信息被复制到新内存区域,旧信息被释放。
基于这个假设,我的问题是:
为什么编译器不尝试查看 [=10= 末尾是否有足够的连续免费使用内存],只在 [= 末尾分配一部分10=],不要浪费时间复制?
是否有人尝试实施此操作,但最终决定不值得这样做? (在average/always)
是否还有其他更微妙的原因导致未发生这种情况?
它结合了您的第 2) 点和第 3) 点。
首先是推断(我不能说当时做了多少测量)收益很少而且不是很大。你只能(显着)增加内存,前提是在原始分配之后没有发生分配,并且增加向量的成本被摊销。
然而许多人指出,即使这种情况也不是那么罕见,并且可以显着提高性能并防止内存碎片。于是就有了proposal in 2006。
这是更微妙的原因。
第一个问题是 Container 不自己分配内存,而是使用 Allocator 来分配内存。因此,首先需要更改分配器接口。这很困难,因为正如其他人所指出的,realloc 只能在包含的类型微不足道的情况下使用。为了普遍有用,我们需要一个不同的低级函数来增加内存(只有在可以就地完成时才重新分配的函数,请参阅提案以获取详细信息)。
问题是不是所有的平台都提供这样的功能,所以我们需要Posix或者C标准先提供一个。
当std::vector
满时,分配新的内存。从我读到的,新容量呈几何级数增长(但这与问题无关),然后旧信息被复制到新内存区域,旧信息被释放。
基于这个假设,我的问题是:
为什么编译器不尝试查看 [=10= 末尾是否有足够的连续免费使用内存],只在 [= 末尾分配一部分10=],不要浪费时间复制?
是否有人尝试实施此操作,但最终决定不值得这样做? (在average/always)
是否还有其他更微妙的原因导致未发生这种情况?
它结合了您的第 2) 点和第 3) 点。
首先是推断(我不能说当时做了多少测量)收益很少而且不是很大。你只能(显着)增加内存,前提是在原始分配之后没有发生分配,并且增加向量的成本被摊销。
然而许多人指出,即使这种情况也不是那么罕见,并且可以显着提高性能并防止内存碎片。于是就有了proposal in 2006。
这是更微妙的原因。 第一个问题是 Container 不自己分配内存,而是使用 Allocator 来分配内存。因此,首先需要更改分配器接口。这很困难,因为正如其他人所指出的,realloc 只能在包含的类型微不足道的情况下使用。为了普遍有用,我们需要一个不同的低级函数来增加内存(只有在可以就地完成时才重新分配的函数,请参阅提案以获取详细信息)。 问题是不是所有的平台都提供这样的功能,所以我们需要Posix或者C标准先提供一个。