std::vector 和 copy 构造函数
std::vector and copy constructors
vector<X> v;
X x;
v.push_back(x); v.push_back(x); v.push_back(x);
为什么这段代码调用类的复制构造函数 X
6 次?(使用 g++ 4.7.2 STL)
拜托,我想知道这个特定的 STL 在引擎盖下会发生什么。
当你插入带有push_back()
的x
时,内存最终会被重新分配,为新元素腾出空间。然后必须使用复制构造函数X(const X&)
复制已插入的成员。
如果插入
v.reserve(3);
至少在前三个push_back()
中阻止重新分配,因此,将只有三个调用来X(const X&)
您可以使用矢量保留事先在矢量中创建空间,以加快向矢量添加元素的速度并阻止这种情况发生。
正确的答案是std::vector
是使用倍增数组实现的(参见:http://en.wikipedia.org/wiki/Dynamic_array),它调用的大约是复制构造函数的 2 * N
倍。
例如,对于N = 100,000
,它会调用复制构造函数231,071
次。正如已经指出的那样,可以通过调用 v.reserve()
来减少重新分配的数量。
这是发生的情况:
在第一个push_back之前,向量的容量(适合它分配的空间的元素数)为 0。因此,当您执行第一个push_back时,它会为 1 个项目分配空间并调用复制构造函数(第一次调用)。
所以现在容量是一个,你告诉它添加另一个项目。因此,它必须分配更多空间,在本例中,为另一个项目分配空间,并将原始项目复制到新空间(第二次调用)。第二个push_back再次调用复制构造函数(第三次调用)。
现在您的容量为 2,并告诉它添加另一个项目。因此,它必须分配更多空间并将项目复制到新空间(第 4 次和第 5 次调用)。然后第三个push_back再次调用复制构造函数(第 6 次调用)。
正如其他人所指出的,您可以使用 reserve,它将预先分配空间,从而避免需要重新分配,从而避免调用复制构造函数。
- C++中的'deep copy'构造函数
- 复制初始化:为什么即使关闭了复制省略,也没有调用move或copy构造函数
- 带有 "this" 关键字的 Java Copy 构造函数
- 为什么在声明析构函数时必须声明 copy & move 构造函数?
- 对链表复制构造函数和赋值运算符使用 copy() 方法
- std::vector 和 copy 构造函数
- 为什么我不能在我的复制构造函数中使用 std::copy?
- 在c++中调用了Niether Copy nor Move构造函数
- 带有抽象类的unique_ptr成员和Copy构造函数的Factory方法模式
- Qt:在QThread-copy的一个子类中,构造函数被编译器删除
- std::p air<> 的模板成员必须具有 const copy 构造函数。如何实现该约束
- 使用 .Copy 执行复制构造函数的最佳方法
- std::copy 和容器的复制构造函数之间是否存在任何性能差异?
- 复制构造函数中的std::copy出错
- 在尝试使用 new 和 copy 构造函数分配内存时,在 '(' 令牌之前获取"预期的非限定 id"
- 调用了Copy构造函数而不是赋值运算符
- 为什么我的 T& 和 T&& copy 构造函数模棱两可?
- 模板"copy constructor"不会阻止编译器生成的移动构造函数
- std::vector initialization元素的move/copy构造函数
- 默认的Copy构造函数和默认的赋值运算符