gpt4 book ai didi

c++ - 复制构造函数调用次数过多

转载 作者:行者123 更新时间:2023-12-03 11:14:58 27 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
#include <vector>
using namespace std;


int counter = 0;
struct vecobj
{
int elem;
vecobj(){ }
vecobj(const vecobj& rhs)
{
counter++;
elem = rhs.elem;


}
};

vector<vecobj> objvec;

int main()
{
vecobj obj1;
obj1.elem = 1;
objvec.push_back(obj1);
objvec.push_back(obj1);
objvec.push_back(obj1);
std::cout <<"copy constructor called "<< counter <<" times\n";
}

我的问题是,当我将一个对象插入 vector objvec 时,我会调用 6 次复制构造函数。虽然我只推了三下。我已经用调试器验证了这一点。我正在使用 Visual Studio 2017 社区版。它是 STL 的错误吗?我认为一个相关的问题并没有完全解决这个问题。没有记录在插入 vector 内存之前必须保留 vector 内存。调用复制构造函数的对象的插入次数过多(斐波那契(n))可能会产生意想不到的副作用。我认为 STL 代码需要改成一样的。

最佳答案

通常 std::vector 实现有一个 capacity 和一个 size 变量。跟踪当前 容量 意味着可以在不请求更大堆 block 的情况下创建的最大元素数。 1size1 跟踪 std::vector 的当前大小。

当我们 push_back 一个元素和大小变得大于 capacity 时,程序将请求新的堆并将所有元素复制到新位置。

容量增加 2 的幂。最初将分配 1 个对象/变量的空间,如果应用程序需要更多空间,则将分配 2 个对象/变量的空间,然后分配 4 个等开。

  1. 当您 push_back 第一个元素时,最初会发生第一次复制。 (1 份)
  2. 当您 push_back 第二个元素时,会分配一个新的内存,并将新元素以及已经 push_back ed 的元素复制到新位置。 (2 份)
  3. 同样会发生第三次三个拷贝。

所有这些都取决于实现。标准不强制要求 std::vector 只能像这样表现。

要保存拷贝,您可以在进行任何 push_back 调用之前 reserve 足够的内存。

关于c++ - 复制构造函数调用次数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65807957/

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