W C++, jeśli masz do pętli że „kopie” obiektów o zdefiniowanym przez użytkownika przy użyciu konstruktora typu ruch [...]
przede wszystkim konstruktor ruch jest używany do move-constructing, co zwykle oznacza, że nie "kopiujesz": możesz wykonać ruch jako kopiowanie - w rzeczywistości klasa, która jest konstruktywna pod względem kopiowania, również jest ruchoma - ale dlaczego właśnie definiujesz konstruktor ruchu?
[...] Czy robi to jakąś różnicę, jeśli używasz ++ i lub i ++ jako licznika pętli?
To zależy od tego, co jest i
. Jeśli jest to obiekt skalarny, taki jak int
, to nie ma żadnej różnicy.
Jeśli i
to klasa typu iterator, z drugiej strony, ++i
powinny być bardziej wydajne (na gruncie czysto teoretycznej), ponieważ realizacja operator ++
nie będzie musiał tworzyć kopię iterator zostać zwrócone przed sam iterator jest inkrementowany.
Oto, na przykład, jest jak stdlibC++ definiuje operatory inkrementacji dla typu iteratora wystąpienia std::list
:
_Self&
operator++()
{
_M_node = _M_node->_M_next;
return *this;
}
_Self
operator++(int)
{
_Self __tmp = *this;
_M_node = _M_node->_M_next;
return __tmp;
}
Jak widać, wersja postfix (jeden przyjmującej obojętne int
) ma więcej pracy zrobić: musi utworzyć kopię oryginalnego iteratora, który ma być odwrócony, a następnie zmienić wewnętrzny wskaźnik iteratora, a następnie zwrócić kopię.
Z drugiej strony, wersja prefiksu musi jedynie zmienić wewnętrzny wskaźnik i powrót (odniesienie do).
Należy jednak pamiętać, że przy wykonywaniu pomiarów wszystkie założenia muszą być poparte pomiarem. W tym przypadku nie oczekuję żadnej sensownej różnicy między tymi dwiema funkcjami.
Zobacz także Herb Sutter [GotW # 2 Solution: Temporary Objects] (http://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/). – jww