我有这段代码:
#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);
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我希望它打印5行(即为向量中的5个元素中的每一个调用析构函数)但实际上输出是:
destroying A 1
destroying A 2
destroying A 3
destroying A 4
destroying A 5
destroying A 6
Run Code Online (Sandbox Code Playgroud)
嗯奇怪......
所以我将主要功能更改为:
int main (int args, char** argv)
{
std::vector<A> vectA(5);
std::cout << vectA.capacity() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
现在的输出是:
destroying A 1
5
destroying A 2
destroying A 3
destroying A 4
destroying A 5
destroying A 6
Run Code Online (Sandbox Code Playgroud)
好的,我想当我第一次创建vectA它时获得一个分配的内存只是A类型的一个对象的大小,然后它被动态调整大小(作为一个向量意味着)包含5个元素(并在此过程中以前分配的内存)获得释放,析构函数被调用).所以我的问题是:为什么vectA从一开始就没有获得正确的内存量?毕竟,值(5)在编译时已知.编译器是否有任何特定原因不执行此优化?
在C++ 11之前,该代码使用此构造函数,该构造函数的count副本为value:
explicit vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator());
Run Code Online (Sandbox Code Playgroud)
一旦C++ 11出现,它就变成了一个构造函数,只需要一个大小并生成count值初始化元素:
explicit vector(size_type count);
Run Code Online (Sandbox Code Playgroud)
因此,在C++ 11之前,您将获得创建的value参数,当与五个元素组合时,该参数总共为六个.在C++ 11之后,它只是五个元素.