【问题标题】:How does vector calls copy constructor on specific location?vector 如何在特定位置调用复制构造函数?
【发布时间】: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 )
  • 请注意,有一个分配和多个复制构造,而不是分配加复制构造每个元素跨度>

标签: c++ vector stl


【解决方案1】:

我假设向量先分配内存,然后在特定位置调用复制构造函数。

没错,这是两个独立的步骤:

  1. 内存分配使用allocator::allocate
  2. 初始化。它使用allocator::construct 复制/移动构造元素,这通常使用placement new。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 2012-11-03
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多