vector 如何在特定位置调用复制构造函数?
Posted
技术标签:
【中文标题】vector 如何在特定位置调用复制构造函数?【英文标题】:How does vector calls copy constructor on specific location? 【发布时间】:2019-05-14 09:26:31 【问题描述】:我想知道向量在 C++ 中是如何工作的。当我们添加一个新元素并且向量用完空间时,它会分配一个新内存并将所有先前的元素复制到新位置。
现在,如何定义这种行为?
A* a = new A(prev_a);
将在新分配的新位置复制构造。但是对于向量,我们必须分配多个对象。但是我们不能这样做,因为数组 new 不能有初始化参数。
所以我想知道,vector 是如何实现这一点的?我假设向量首先分配内存并在特定位置调用复制构造函数。这是怎么做的?谢谢
【问题讨论】:
您可以查看成员 _M_allocate_and_copy 的 (GCC) 实现:template<typename _ForwardIterator > pointer std::vector::_M_allocate_and_copy ( size_type __n, _ForwardIterator __first, _ForwardIterator __last )
供参考:en.cppreference.com/w/cpp/memory/allocator_traits/construct
请注意,有一个分配和多个复制构造,而不是分配加复制构造每个元素跨度>
【参考方案1】:
我假设向量先分配内存,然后在特定位置调用复制构造函数。
没错,这是两个独立的步骤:
-
内存分配使用
allocator::allocate
。
初始化。它使用allocator::construct 复制/移动构造元素,这通常使用placement new。
【讨论】:
以上是关于vector 如何在特定位置调用复制构造函数?的主要内容,如果未能解决你的问题,请参考以下文章