2010-01-21 7 views

Odpowiedz

15

Wolę przechodząc prymitywne typy (int, char, float, ...) i przypisać struktury POD że są tanie skopiować (punkt, kompleks) przez wartość.

To będzie bardziej wydajny niż wymagane wskazanie pośrednie podczas przechodzenia przez odniesienie.

Zobacz Boost's Call Traits.

Klasa szablon call_traits<T> obudowuje „najlepszy” sposób przekazać parametr pewnego typu T lub od funkcji i składa się ze zbioru typedefs zdefiniowane w poniższej tabeli. Celem call_traits jest zapewnienie, że problemy takie jak "odniesienia do referencji" nigdy nie będą występować, a parametry będą przekazywane w najbardziej efektywny sposób.

4

Tak, dostępu do przekazany argument odniesienia może wymagać więcej poziomów zadnie niż przed przekazywane przez wartość argumentu. Poza tym może być wolniejsze, jeśli rozmiar argumentu jest mniejszy niż rozmiar pojedynczego wskaźnika. Oczywiście wszystko to zakłada, że ​​kompilator go nie optymalizuje.

+0

Jak można sprawdzić, czy jego kompilator optymalizuje to? – Arthur

+2

Patrząc na kod binarny –

7

Możesz przeczytać ten artykuł "Want speed ? Pass by value" o elizji kopiowania i RVO (Return by Value Optimization). Wyjaśnia, że ​​odwołania czasami uniemożliwiają wykonanie kompilatora.

1

kompilator może zoptymalizować przechodzącą pierwotnych jedynie w odniesieniu do przechodzącej przez wartość, jeśli typ jest tej samej wielkości, lub mniejsze niż wielkość odniesienia/wskaźnik. Nie ma gwarancji, że kompilator to zrobi, więc jeśli masz wybór, przekaż typy pierwotne według wartości. Jednak w szablonowym kodzie często trzeba przejść przez referencję - weź pod uwagę push_back wektora, który przyjmuje referencję const. Jeśli masz wektor intów, podajesz odniesienie do typu pierwotnego. W tej sytuacji możesz mieć nadzieję, że kompilator zoptymalizuje to, zastępując odniesienie wartością. Ponieważ wektor może przechowywać duże typy, akceptowanie referencji stałych jest najlepszym wyborem.

+0

"Kompilator mógł zoptymalizować ...", o ile adresat nie zmodyfikuje referandu ani nie odczyta go po wywołaniu jakiegokolwiek kodu, który mógłby go zmodyfikować. Ale oczywiście w przypadkach, w których tak się dzieje, masz nadzieję, że nie zadajesz pytania "co jest droższe", a raczej "co jest poprawne" :-) Niezręczne to przypadki, w których uważasz, że kompilator może zoptymalizować, ale w rzeczywistości nie może, ponieważ przeoczyłeś jakiś powód, dla którego musi to być odniesienie (reguły aliasów są główną przyczyną niespodzianek). –

Powiązane problemy