内存扩展
但是它们是否以相同的方式扩展内存?
它没有在 C++11 中明确指定(我检查过),但是是的。
resize
在这种情况下被定义为“附加到容器”,唯一的逻辑解释使其等同于分配insert
并push_back
就分配而言。
容器实现的后端通常在其内存块扩展的所有情况下分配“超过它需要的” - 这是由标准不禁止它而不是标准强制它完成的,并且没有任何措辞表明也不是这种情况resize
。
最终,这完全取决于实现,但我会惊讶地看到在任何主流编译器上这两种方法之间的内存分配规则存在差异。
这个测试用例展示了一个简单的例子:
#include <iostream>
#include <vector>
int main() {
std::vector<int> a, b;
for(int i = 0; i != 100; ++i)
a.push_back(0);
for(int i = 0; i != 100; ++i)
b.resize(i+1);
std::cout << a.capacity() << " , " << b.capacity() << std::endl;
}
// Output from my GCC 4.7.2:
// 128 , 128
请注意,这个略有不同:
int main() {
std::vector<int> a, b;
for(int i = 0; i != 100; ++i)
a.push_back(0);
b.resize(100);
std::cout << a.capacity() << " , " << b.capacity() << std::endl;
}
// Output from my GCC 4.7.2:
// 128 , 100
这不是两种方法之间的公平测试,因为在后一个示例中,我们以不同的增量扩展内存,并且内存支持序列容器倾向于以倍数扩展。
性能问题
无论如何,正如@Pubby 所指出的那样,在这种resize
情况下,您将先进行隐式构造,然后再进行显式分配,如果您过早地进行优化,这是非最佳的。
在现实世界中,真正的问题是使用了错误的函数并编写了愚蠢的代码。