W C++, czy istnieje wydajność przy przekazywaniu typów pierwotnych przez odniesienie zamiast zwracania przez wartość?Jakiekolwiek korzyści związane z wydajnością przy przekazywaniu typów pierwotnych przez odniesienie zamiast zwracania przez wartość?
Odpowiedz
W tym przypadku może istnieć jakaś niejasna architektura, ale nie jestem świadomy, gdzie powracające typy wbudowane są mniej wydajne niż przekazywanie parametru out przez odniesienie. Zawsze możesz sprawdzić odpowiedni zespół, aby porównać, jeśli chcesz.
[...] Czy istnieje korzyść związana z wydajnością polegająca na przekazywaniu typów pierwotnych przez odniesienie zamiast zwracania przez wartość?
Nieprawdopodobne. Przede wszystkim, jeśli nie masz danych z profilera, które dają powody do działania w inny sposób, nie powinieneś martwić się o problemy z wydajnością podczas projektowania programu. Wybierz najprostszy model , a projekt, który najlepiej będzie spełniać komunikacja .
Co więcej, typy pierwotne są zazwyczaj tanie w kopiowaniu, więc jest to mało prawdopodobne, aby stanowiło wąskie gardło w aplikacji. A ponieważ jest to najprostsza opcja i ta, która sprawia, że interfejs funkcji jest najwyraźniejszy, należy podać wartość.
Po prostu patrząc na podpis, jest oczywiste, że funkcja takich jak:
void foo(int);
nie przechowuje referencję do argumentu (a co za tym idzie, nie będzie działać w takich kwestiach jak zwisające referencje lub wskaźniki), nie zmieni argumentu w sposób widoczny dla osoby dzwoniącej i tak dalej.
Żadne z powyższych można wywnioskować z podpisem funkcji jak:
void f(int&); // May modify the argument! Will it? Who knows...
lub nawet:
void f(int const&); // May store a reference! Will it? Who knows...
Poza tym, przechodząc przez wartości mogą nawet zwiększyć wydajność, pozwalając kompilator wykonywać optymalizacje że potencjalne aliasing zapobiegnie.
Oczywiście wszystko to przy założeniu, że faktycznie nie trzeba modyfikować argumentu wewnątrz funkcji w taki sposób, że efekty uboczne dla tego argumentu będą widoczne dla osoby dzwoniącej po powrocie funkcji - lub zapisaniu odniesienie do tego argumentu.
Jeśli tak jest, należy oczywiście przejść przez odniesienie i użyć odpowiedniej kwalifikacji const
.
Dla szerszej dyskusji zobacz także this Q&A on StackOverflow.
Zasadniczo nie będzie żadnych korzyści związanych z wydajnością, a także mogą wystąpić koszty wydajności. Rozważmy następujący kod:
void foo(const int& a, const int& b, int& res) {
res = a + b;
res *= a;
}
int a = 1, b = 2;
foo(a, b, a);
Gdy kompilator napotka funkcji takich jak add() należy założyć, że i res może alias jak w przykładzie rozmowy więc bez globalnych optymalizacje to będzie musiał wygenerować kod, który ładuje, ładunki b, następnie przechowuje wynik a + b do res, następnie ładuje a ponownie i wykonuje mnożenie, przed zapisaniem wyniku z powrotem do res.
Jeśli zamiast tego którą napisał swoją funkcję tak:
int foo(int a, int b) {
int res = a + b;
res *= a;
return res;
}
int a = 1, b = 2;
int c = foo(a, b);
Następnie kompilator może załadować i B do rejestrów (lub nawet przekazać je bezpośrednio w rejestrach), czy dodatek i rozmnażajcie się w rejestrach i następnie zwróć wynik (który w wielu konwencjach wywołujących może zostać zwrócony bezpośrednio w rejestrze, w którym został wygenerowany).
W większości przypadków rzeczywiście potrzebujesz semantyki w wersji pass/return według wartości foo, a semantyka aliasingowa możliwa w wersji pass/return przez odniesienie nie musi być obsługiwana. Możesz zapłacić prawdziwą karę za wyniki, korzystając z wersji pass/return według wersji referencyjnej.
Chandler Carruth dał dobry talk, który dotknął tego w C++ teraz.
- 1. Php przekazany przez wartość lub przez odniesienie
- 2. Korzyści z x87 przez SSE
- 3. Jakiekolwiek ryzyko związane z Macports?
- 4. VB6 przejść przez wartość i przejść przez odniesienie
- 5. Czy rzut w połowie (...) rzucać przez wartość lub przez odniesienie
- 6. Czy są jakieś korzyści związane z wydajnością, używając parametru ReadOnly w trybie hibernacji?
- 7. Skutki związane z wydajnością przesyłu C#
- 8. Przekazywanie wektorów przez odniesienie
- 9. Przekazywanie tablic przez odniesienie?
- 10. Przekazywanie tablicy przez odniesienie
- 11. Injection dependency C++ - przez odniesienie lub przez boost :: shared_ptr?
- 12. funkcja pass przez wartość (?) Zamiast wskaźnika funkcji?
- 13. Jak przekazać podciągi przez odniesienie?
- 14. W julia funkcje: przekazywane przez odniesienie lub wartość?
- 15. Python numpy i wydajność pamięci (przekazywanie przez odniesienie vs. wartość)
- 16. Null dla pierwotnych typów danych
- 17. Podanie wartości zwracanej przez funkcję jako odniesienie
- 18. przypisanie tablicy php przez skopiowanie wartości lub przez odniesienie?
- 19. Przesyłanie argumentów tablicowych przez odniesienie
- 20. Problemy ze zrozumieniem przekazać przez odniesienie
- 21. Recursion i przechodzącej przez odniesienie
- 22. Czy funkcja JavaScript domyślnie zwraca obiekty przez odniesienie lub wartość?
- 23. Korzystanie struct przekazać parametry przez odniesienie
- 24. Prawidłowy sposób korzystania z DropDownListFor z listą typów pierwotnych?
- 25. Jak zapobiec przekazywaniu pakietów przez jądro do warstwy sieci?
- 26. Jak zwrócić obiekt klasy przez odniesienie w C++?
- 27. Sortowanie ConcurrentDictionary przez wartość
- 28. Przechodząc opcjonalny parametr przez odniesienie w C++
- 29. Czy zasoby php są przekazywane przez odniesienie?
- 30. PHP Iterator nie może być używany z foreach przez odniesienie
Prawdopodobnie nie, ale ostatecznie musisz profilować swoją konkretną sytuację, aby naprawdę wiedzieć. –
możliwy duplikat [Jak przekazać obiekty do funkcji w C++?] (Http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-function -in-c) – soon
typy prymitywów @soon! = obiekty. – djechlin