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

时间:2014-02-21 14:54:04

标签: c++ vector stl

我有这段代码:

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

1 个答案:

答案 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之后,它只是五个元素。