为什么这个程序有这种行为(push_back)

Why this program has this behaviour (push_back)?

本文关键字:push back 程序 为什么      更新时间:2023-10-16

代码:

// test2.cpp
#include <vector>
#include <iostream>
struct test_class
{
    test_class() = default;
    test_class(const test_class& t)
    {
        std::cout << "Copied" << std::endl;
    }
};
int main()
{
    test_class a;
    std::vector<test_class> v;
    for (int i = 0; i < 5; ++i) {
        v.push_back(a);
        std::cout << std::endl;
    }
}

行为:

$ g++ --version | grep g++
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
$ g++ -std=c++11 test2.cpp
$ ./a.out
Copied
Copied
Copied
Copied
Copied
Copied
Copied
Copied
Copied
Copied
Copied
Copied

每个push_back执行一个"未定义"数量的拷贝(其中只需要执行一个拷贝)。

这是怎么回事?

vector像数组一样分配连续内存。如果在内存的末端没有更多的空间,它必须重新分配整个向量。在此之后,它会将元素从旧的位置复制到新的位置,并删除旧的。

您可以初始化它,使其能够容纳至少5个元素,因此在您的示例中不会有内存分配和复制:

std::vector<test_class> v(5);

push_back可能导致vector增长超过其分配的存储空间,从而导致重新分配,从而导致内容被复制。