Czy istnieje przypadek, gdy przechodzą przez odwołanie jest droższy niż przechodzić przez wartość w C++? Jeśli tak, jaki byłby to przypadek?Pass od odniesienia droższe niż przechodzić przez wartość
Odpowiedz
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. Celemcall_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.
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.
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.
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.
"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). –
- 1. Pass od wskaźnika & Przełęczy przez odniesienie
- 2. funkcja pass przez wartość (?) Zamiast wskaźnika funkcji?
- 3. Swift - jak przechodzić przez NSDictionary
- 4. Lepiej/Szybciej przechodzić przez zestaw lub listę?
- 5. Przechodzić listy począwszy od pewnego elementu
- 6. Przejście przez opcje odniesienia w C++
- 7. Pass Array od MVC do javascript?
- 8. Jak mogę przechodzić przez wszystkie trasy?
- 9. vb.net jak przechodzić przez listę katalogów?
- 10. jak można przechodzić przez wiele tablic równolegle?
- 11. Python: Jak przechodzić przez bloki linii
- 12. Czy możesz przechodzić przez wszystkie przyciski opcji?
- 13. Potrafię tylko raz przechodzić przez czytnik CSV.
- 14. Jak przechodzić przez wszystkie elementy formularza jQuery
- 15. Jak mogę przechodzić przez wyliczenie w Javie?
- 16. Jak przechodzić przez obiekt SimpleXML w PHP
- 17. Rekurencyjnie przechodzić przez NSDictionary o nieznanej strukturze
- 18. Jak przechodzić przez JSON z SwiftyJSON?
- 19. Jak przechodzić przez niezmienną listę jak forEach?
- 20. Jak przechodzić między tablicami zaczynającymi się od różnych indeksów, wciąż przechodząc przez całą tablicę?
- 21. mogę zmusić `const` przechodzić przez odniesienie (aka brakującej` in` parametru)
- 22. Jak przechodzić przez pola obiektów JSON za pomocą JsPath?
- 23. Pass kwargs z nieprawidłowymi pary klucz = wartość funkcjonować
- 24. Android (JSONObject) Jak mogę przechodzić przez płaski obiekt JSON, aby uzyskać każdy klucz i każdą wartość
- 25. Pass Typ wartość tabeli SQL Server procedury przechowywane przez Entity Framework
- 26. Pass vba Dictionary
- 27. Zastąp wartość obiektu bez zastąpienia odniesienia
- 28. Określ domyślną wartość dla typu odniesienia
- 29. Jak odniesienia wartość powrotną Perl sub
- 30. Czy można przechodzić przez klasy członków w java?
Jak można sprawdzić, czy jego kompilator optymalizuje to? – Arthur
Patrząc na kod binarny –