我有这段代码:
#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行(即向量中的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类型的一个对象的大小,然后动态调整大小(因为向量意味着)包含5个元素(并且在此过程中,先前分配的内存被释放,并且析构函数被调用。
所以我的问题是:为什么vectA
从一开始就没有获得正确的内存量?毕竟,值(5)在编译时已知。编译器是否有任何特定原因不执行此优化?
答案 0 :(得分:8)
在C ++ 11之前,该代码使用了这个构造函数,它构成了count
的{{1}}个副本:
value
一旦C ++ 11出现,它就变成了一个只需要一个大小并构造explicit vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator());
值初始化元素的构造函数:
count
因此,在C ++ 11之前,您将获得创建的explicit vector(size_type count);
参数,当与五个元素组合时,该参数共计六个。在C ++ 11之后,它只是五个元素。