vector<shared_ptr<X>> copying- 调用了 X 构造函数?
vector<shared_ptr<X>> copying- X constructor called?
我有一个std::vector<std::shared_ptr<X>>
我正在查看 MSVC 向量复制构造函数实现。我可以看到向量在何处迭代源向量并复制每个元素。我可以看到在哪里调用了 placement new 并调用了 shared_ptr 构造函数,但是我看不到 class X
的构造函数被调用。我正在调试中逐步执行代码,但我从未从 class 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
。我们移动 and/or 复制一个 shared_ptr
,它可能包含一个指向 X
的指针。复制指向 X
的指针不需要我们复制对象。
X *obj = new X;
X *ptr_copy = obj;
那里也没有调用 X 的复制构造函数。
shared_ptr的所有副本都指向同一个对象X。当shared_ptr的新副本创建时X不会被复制。
shared_ptr 计算它的副本数并在 shared_ptr 的最后一个副本被删除时删除对象。
当您为包含 shared_ptr 个元素的 std::vector<> 执行复制构造函数时,它会增加 shared_ptr 个对象中的计数器。它不会创建 X 的新对象,而是会使用 shared_ptr 中的计数器增加共享对象的数量。所以你不会看到 X
的构造函数的执行
我有一个std::vector<std::shared_ptr<X>>
我正在查看 MSVC 向量复制构造函数实现。我可以看到向量在何处迭代源向量并复制每个元素。我可以看到在哪里调用了 placement new 并调用了 shared_ptr 构造函数,但是我看不到 class X
的构造函数被调用。我正在调试中逐步执行代码,但我从未从 class 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
。我们移动 and/or 复制一个 shared_ptr
,它可能包含一个指向 X
的指针。复制指向 X
的指针不需要我们复制对象。
X *obj = new X;
X *ptr_copy = obj;
那里也没有调用 X 的复制构造函数。
shared_ptr的所有副本都指向同一个对象X。当shared_ptr的新副本创建时X不会被复制。 shared_ptr 计算它的副本数并在 shared_ptr 的最后一个副本被删除时删除对象。
当您为包含 shared_ptr 个元素的 std::vector<> 执行复制构造函数时,它会增加 shared_ptr 个对象中的计数器。它不会创建 X 的新对象,而是会使用 shared_ptr 中的计数器增加共享对象的数量。所以你不会看到 X
的构造函数的执行