gpt4 book ai didi

c++ - STL 容器如何复制对象?

转载 作者:可可西里 更新时间:2023-11-01 15:07:12 25 4
gpt4 key购买 nike

我知道像 vector 这样的 STL 容器会在添加对象时复制对象。 push_back 方法如下所示:

void push_back ( const T& x );

我很惊讶地看到它将项目作为引用。我写了一个示例程序来查看它是如何工作的。

struct Foo
{
Foo()
{
std::cout << "Inside Foo constructor" << std::endl;
}

Foo(const Foo& f)
{
std::cout << "inside copy constructor" << std::endl;
}
};

Foo f;
std::vector<Foo> foos;
foos.push_back(f);

这会复制对象,我可以看到它正在调用copy-constructor

我的问题是,当 push_back 将 item 作为引用时,它是如何调用复制构造函数的?或者我在这里遗漏了什么?

有什么想法..?

最佳答案

它可能使用“placement new”在其内部数组中就地构造对象。放置 new不分配任何内存;它只是将对象放置在您指定的位置,然后调用构造函数。语法是 new (address) Class(constructor_arguments) .

复制构造函数T::T(T const &)被调用以就地创建拷贝。像这样(简化):

template<T>
void vector<T>::push_back(T const &item) {
// resize if necessary
new (&d_array[d_size++]) T(item);
}

请注意 T必须有一个复制构造函数才能工作。默认情况下(如果您什么都不做),它会免费获得一个。如果你明确定义它,它必须是public对于 vector<T>去工作。

Here's how GNU's libstdc++ does it ,但我怀疑它会很有启发性。有一个分配器(vector 的第二个模板参数)使其不那么直接。

关于c++ - STL 容器如何复制对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1693042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com