C++向量没有任何理由调整大小

Und*_*ior 4 c++ stl vector

我有这段代码:

#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)在编译时已知.编译器是否有任何特定原因不执行此优化?

chr*_*ris 8

在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之后,它只是五个元素.