Dlaczego realokacja kopii wektorowej zamiast przesuwania elementów? [duplikować]

Możliwy duplikat:
Jak wymusić semantykę ruchu, gdy wektor rośnie?

insert, push_back iemplace(_back) może spowodować realokację astd::vector. Byłem zaskoczony, widząc następujący kodkopie elementy zamiastw ruchu je przy realokacji kontenera.

<code>#include <iostream>
#include <vector>

struct foo {
    int value;

    explicit foo(int value) : value(value) {
        std::cout << "foo(" << value << ")\n";
    }

    foo(foo const& other) noexcept : value(other.value) {
        std::cout << "foo(foo(" << value << "))\n";
    }

    foo(foo&& other) noexcept : value(std::move(other.value)) {
        other.value = -1;
        std::cout << "foo(move(foo(" << value << "))\n";
    }

    ~foo() {
        if (value != -1)
            std::cout << "~foo(" << value << ")\n";
    }
};

int main() {
    std::vector<foo> foos;
    foos.emplace_back(1);
    foos.emplace_back(2);
}
</code>

Na mojej konkretnej maszynie używającej mojego specyficznego kompilatora (GCC 4.7) wypisuje:

<code>foo(1)
foo(2)
foo(foo(1))
~foo(1)
~foo(1)
~foo(2)
</code>

Jednak podczas usuwania konstruktora kopii (foo(foo const&) = delete;), generowane jest następujące (oczekiwane) wyjście:

<code>foo(1)
foo(2)
foo(move(foo(1))
~foo(1)
~foo(2)
</code>

Dlaczego? Czy ruch na ogół nie byłby bardziej wydajny, a przynajmniej nie mniej wydajny niż kopiowanie?

Zauważa toGCC 4.5.1 robi oczekiwaną rzecz - czy jest to regresja w GCC 4.7, czy jest to jakaś sprytna optymalizacja, ponieważ kompilator widzi, że mój obiekt jest tani do skopiowania (ale jak ?!)?

Zauważ również, że upewniłem się, że tojest spowodowane przez realokację przez eksperymentalne wprowadzeniefoos.reserve(2); przed wstawkami; powoduje to, że kopia ani ruch nie są wykonywane.

questionAnswers(3)

yourAnswerToTheQuestion