1

コード:

// 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が「未定義」の数のコピーを実行します(1つのコピーのみを実行する必要があります)。

ここで何が起こっているのですか?

4

2 に答える 2

3

ベクトルは、配列と同様に連続メモリを割り当てます。メモリの最後にスペースがなくなると、ベクトル全体を再割り当てする必要があります。この後、要素を古い場所から新しい場所にコピーし、古い場所を削除します。

少なくとも 5 つの要素を保持できるように初期化できるため、例ではメモリの割り当てとコピーは行われません。

std::vector<test_class> v(5);
于 2012-12-21T12:42:35.897 に答える
1

によって、割り当てられたストレージを超えて が拡張されるpush_back可能性がありvectorます。これにより、再割り当てが発生し、内容がコピーされます。

于 2012-12-21T12:36:24.863 に答える