C++ vector 无故调整大小

标签 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 行(即为 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/

相关文章:

c++ - 从网格渲染 RGB-D 图像

C++ 服务器连接问题

c++ - 从 2 个进程读取/写入同一文件

r - 聚类向量在 R 中得到一个零一矩阵

java - Java Vector2d 类中的旋转

r - 查找包含一小部分 0 的最大长度子向量

c++ - 将包含指针的数据插入 vector

c++ - QtConcurrent映射和进度报告

c++ - std::map::insert(...) 中的段错误

c++ - 使用数组作为映射键 : impossible even with custom allocator?