Jeśli masz kompilatora, który obsługuje referencje rvalue, zostanie on przeniesiony do wektora, który jest czasami dość tani.
Alternatywą to bezpośrednio skonstruowania obiektu w wektorze, co może być wykonane z vec.emplace_back("abc");
. To wywołuje tylko jeden konstruktor.
Oba są C++ 11 funkcji. Kopiowanie elizji nie jest tutaj dozwolone, więc bez tych funkcji kopia nadal będzie wykonana.
Jednakże, jeśli konstruktor kopiowania nie ma możliwych do zaobserwowania efektów ubocznych (które i tak nie powinno mieć), inteligentny kompilator może nadal wykonywać tę optymalizację, ponieważ reguła "jak to możliwe" pozwala na dowolną optymalizację, która skutkuje to samo obserwowalne zachowanie. Nie wiem jednak, czy jakikolwiek obecny kompilator to robi. Jeśli nie, wątpię, by ktokolwiek dołożył starań, aby dodać taką optymalizację, ponieważ referencje rvalue położyły kres tej potrzebie.
Nie sądzę tak dlatego, że 'vector' (podzielników STL faktycznie) używa kwalifikacyjny' new'. –
@Seth Carnegie - jak to się ma do umieszczenia "nowego"? załóżmy, że masz wystarczająco dużo wolnego miejsca w wektorze, wtedy kompilator może po prostu skonstruować instancję 'A' na miejscu. –
@Nya ponieważ kompilator prawdopodobnie nie będzie zorientować się, gdzie zostanie on utworzony (nie to, że nie można, ale to, że nie będzie, bo twórcy kompilatora nie pisać, że optymalizacja). –