gpt4 book ai didi

C++ vector 无故调整大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:32 25 4
gpt4 key购买 nike

我有这段代码:

#include<iostream>
#include<vector>

class A
{
private:
static int x;

public:
A(){}
~A()
{
++x;
std::cout << "destroying A " << x << std::endl;
}

};

int A::x(0);

int main (int args, char** argv)
{
std::vector<A> vectA(5);
}

当我运行它时,我希望它打印 5 行(即为 vector 中的 5 个元素中的每一个元素调用析构函数)但实际上输出是:

destroying A 1
destroying A 2
destroying A 3
destroying A 4
destroying A 5
destroying A 6

嗯,奇怪...

所以我将主要功能更改为:

int main (int args, char** argv) 
{
std::vector<A> vectA(5);
std::cout << vectA.capacity() << std::endl;
}

现在输出是:

destroying A 1
5
destroying A 2
destroying A 3
destroying A 4
destroying A 5
destroying A 6

好的,所以我想当我第一次创建 vectA 时,它会分配一个大小为 A 类型对象的内存,然后它会动态调整大小(作为 vector 的本意)以包含5 个元素(在此过程中,先前分配的内存被释放,析构函数被调用)。所以我的问题是:为什么 vectA 没有从一开始就获得正确数量的内存?毕竟,值 (5) 在编译时是已知的。编译器是否有任何特定原因不执行此优化?

最佳答案

在 C++11 之前,该代码使用此构造函数,它生成 countvalue 拷贝:

explicit vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator());

一旦 C++11 出现,它就变成了一个构造函数,它只接受一个大小并使 count 值初始化元素:

explicit vector(size_type count);

因此,在 C++11 之前,您将获得创建的 value 参数,当它与五个元素组合时,总共有六个。在 C++11 之后,它只是五个元素。

关于C++ vector 无故调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937690/

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