我有一个 std::vector<std::shared_ptr<X>>
我正在查看 MSVC vector 复制构造函数的实现。我可以看到 vector 在何处迭代源 vector 并复制每个元素。我可以看到在哪里调用了 placement new 并调用了 shared_ptr 构造函数,但是我看不到类 X
的构造函数被调用。我在调试中单步执行代码,但从未访问过 X 类的任何构造函数。
肯定在某些时候需要 X 的复制构造函数?还是我错了?
最佳答案
如果我们有代码:
std::vector<std::shared_ptr<X>> vec;
for (int i=0; i<10000; ++i)
vec.emplace_back();
我们希望 X
的构造函数被调用零次,X
的复制构造函数被调用零次,X 的移动构造函数被调用
被调用零次。
如果我们有代码:
std::vector<std::shared_ptr<X>> vec;
vec.push_back(std::make_shared<X>());
for (int i=0; i<10000; ++i)
vec.emplace_back();
我们希望 X
的构造函数被调用一次,而 X
的复制和移动构造函数将被调用零次。
为什么?
我们从不移动或复制X
。我们移动和/或复制一个 shared_ptr
,它可能包含一个指向 X
的指针。复制指向 X
的指针不需要我们复制对象。
X *obj = new X;
X *ptr_copy = obj;
那里也没有调用 X 的复制构造函数。
关于c++ - vector<shared_ptr<X>> copying-调用了X构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29572417/