sil*_*orb 13 c++ stl allocation stdmap stdvector
鉴于代码:
class Foo {
std::vector<int> items;
std::map<int, int> dictionary;
};
Run Code Online (Sandbox Code Playgroud)
如果没有任何东西被添加到上面的矢量或地图中,还是会分配一块缓冲存储器吗?(换句话说,缓冲区分配总是在容器创建期间发生,还是可以在调用push_back之类的函数之前推迟?)
是否存在处理初始STL容器缓冲区分配时间的标准,或者是否允许STL容器和编译器之间的行为不同?
注意:这个问题不是关于这样的容器会增加类Foo大小的额外字节.
(这个问题的一个相关子集强调分配大小是C++中向量的初始容量.)
C++参考使用C++ 17,默认构造函数是noexceptiff分配器构造noexcept.所以它取决于使用的分配器.在VS 2015中,标准构造函数是noexcept.
澄清:这意味着如果分配器为no,noexcept则不分配任何内存块.
对于你的第二个问题:相同的参考,它是O(1).
标准没有说明任何内容,但我特别注意的实现将做一些预先std::vector分配,并且不会预先分配任何东西std::map.
这实际上曾经让我困难,当我讨厌一个巨大的容器,哪些元素有一个微不足道 - 不超过10个元素,大多数条目有0大小的向量 - 矢量在其中.此实现中的默认向量容量为32,并且'32*sizeof(vector_element)*number_of_elements'恰好非常大.