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

的构造函数的执行