【发布时间】:2016-06-07 03:45:34
【问题描述】:
给定代码:
class Foo {
std::vector<int> items;
std::map<int, int> dictionary;
};
如果上述向量或映射中没有添加任何内容,是否仍会分配一块缓冲内存? (换句话说,缓冲区分配是否总是在容器创建期间发生,还是可以推迟到调用 push_back 之类的函数?)
是否有处理初始 STL 容器缓冲区分配时间的标准,或者该行为是否允许在 STL 容器和编译器之间有所不同?
注意:这个问题不是关于这样的容器会添加到类 Foo 的大小的额外字节。
(这个问题的一个相关子集强调分配大小是Initial capacity of vector in C++。)
【问题讨论】:
-
我怀疑标准是否定义了这样的东西。您可以通过使用自定义分配器制作容器来检查您的实现。
-
标准并没有说什么,但大多数实现都会为
vector做一些预分配,并且不会为map预分配任何东西。 -
@DOUGLASO.MOEN 是对象的大小,而不是内部缓冲区的大小。
-
如果实现实际上在初始化时分配了任何内存,我会感到惊讶,因为我看不出将时间浪费在没有添加任何内容的潜在代码路径上符合人体工程学。我认为这样做没有任何好处,但有明显的缺点。我所看到的是实现分配而不是在分配时立即需要。
-
@DavidHaim:没有什么能阻止容量随着
0, 8, 16, 32, 64增长(跳过第一个小值)。没有预分配允许保留正确的大小,只有 1 个分配而不是 2 个。容量增长的变化只增加了一个分配测试。
标签: c++ stl stdvector allocation stdmap