Czy kolejność elementów w architekturze binarnej obiektów klasy może mieć jakiś wpływ na wydajność aplikacji korzystających z tej klasy? i zastanawiam się, jak określić kolejność członków POD, w przypadku gdy odpowiedź brzmi "tak", ponieważ programista definiuje kolejność członków za pomocą ich rozkazów:Czy kolejność członków obiektów klasy ma jakikolwiek wpływ na wydajność?
Odpowiedz
Absolutnie. C++ gwarantuje, że kolejność obiektów w pamięci jest taka sama jak kolejność deklaracji, chyba że interweniuje kwalifikator dostępu.
Obiekty, które są bezpośrednio przylegające, z większym prawdopodobieństwem znajdują się na tej samej linii pamięci podręcznej, więc jeden dostęp do pamięci pobierze je oba (lub wypłucze obie z pamięci podręcznej). Efektywność pamięci podręcznej może również ulec poprawie, ponieważ odsetek użytecznych danych w niej może być wyższy. Mówiąc krótko, położenie przestrzenne w kodzie przekłada się na położenie przestrzenne w celu uzyskania wydajności.
Ponadto, jak zauważa Jerry w komentarzach, kolejność może wpływać na ilość wypełnienia. Posortuj elementy, zmniejszając rozmiar, co jest również zmniejszeniem wyrównania (zwykle traktuj tablicę jako tylko jeden element jej typu i element członkowski struct jako najbardziej wyrównany element). Niepotrzebne wypełnienie może zwiększyć całkowity rozmiar struktury, prowadząc do większego ruchu pamięci.
C++ 03 §9/12:
Nonstatic członkowie danych o (spoza Unii) klasy zadeklarowane bez interwencyjnym access-specyfikatorem przydzielane są tak, że później członkowie mają wyższe adresy wewnątrz obiekt klasy . Kolejność przydzielania niestatycznych elementów danych oddzielonych przez specyfikator dostępu jest nieokreślona (11.1). Wyrównanie implementacji wymagania mogą spowodować, że dwaj sąsiadujący członkowie nie będą przydzielani od razu do siebie po ; więc może wymagać przestrzeni do zarządzania funkcji wirtualnych (10.3) i wirtualnych klas bazowych (10.1).
Absolutnie zgadzam się z Potatoswatter. Jednak należy dodać jeszcze jeden punkt dotyczący linii pamięci podręcznej procesora.
Jeśli twoja aplikacja jest wielowątkowa i inne wątki odczytują/zapisują członków twojej struktury - bardzo ważne jest, aby upewnić się, że ci członkowie są , a nie w obrębie tej samej linii pamięci podręcznej.
Chodzi o to, że ilekroć wątek modyfikuje adres pamięci, który jest buforowany w innym CPU - CPU natychmiast unieważnia linię pamięci podręcznej zawierającą ten adres. Tak więc niewłaściwa kolejność członków może prowadzić do nieuzasadnionego unieważniania pamięci podręcznej i obniżenia wydajności.
Oprócz wykonywania wykonawczego, opisane w cache-linia związanych odpowiedzi, myślę, że należy również rozważyć wydajność pamięci, to jest rozmiar obiektu klasy.
Ze względu na padding rozmiar obiektu klasy zależy od kolejności deklaracji zmiennej składowej.
Poniższa deklaracja będzie prawdopodobnie zajmie 12 bajtów
class foo {
char c1;
int i;
char c2;
}
Jednak po prostym ponownego uporządkowania kolejności deklaracji zarejestrował następujące prawdopodobnie wziąć 8 bajtów
class bar {
int i;
char c1;
char c2;
}
W maszynach ustawionych z 4-bajtowymi słowami:
sizeof(foo) = 12
ale
sizeof(bar) = 8
- 1. Czy kolejność przełączników ma wpływ na prędkość?
- 2. Czy zewnętrzne "C" ma jakikolwiek wpływ na C?
- 3. Czy dodanie [Serializable] do klasy może mieć wpływ na wydajność?
- 4. Wpływ Console.Writeline na wydajność
- 5. Systemtap wpływ na wydajność
- 6. Log.d i wpływ na wydajność
- 7. Java 8: Operacja łączenia ciągów ma znaczący wpływ na wydajność
- 8. Wpływ metod wirtualnych na wydajność
- 9. Znaczniki a punkty wektorowe - wpływ na wydajność
- 10. Czy kolejność kolumn w zapytaniu ma znaczenie?
- 11. Czy CountDownLatch ma wpływ na fałszywe wybudzenia?
- 12. Wpływ na wydajność dyrektywy ng-csp
- 13. Jaki jest wpływ selektora uniwersalnego na wydajność?
- 14. Czy uruchamianie bazy danych SQL Server 2005 na poziomie zgodności 80 ma negatywny wpływ na wydajność?
- 15. Czy SMLNJ ma jakikolwiek debugger?
- 16. Zagnieżdżony wpływ selektorów na wydajność i MNIEJ
- 17. Dlaczego lenistwo Haskella miało wpływ na wydajność?
- 18. Czy układ/kolejność tabel w klauzuli FROM ma wpływ na polepszenie wydajności?
- 19. Czy inicjalizacja zmiennej lokalnej o wartości zerowej ma wpływ na wydajność?
- 20. React Native - czy console.log() ma negatywny wpływ na wydajność podczas przechodzenia do produkcji?
- 21. Czy kolejność klawiszy w data.table ma znaczenie?
- 22. Jaki jest wpływ nie unikatowych indeksów na wydajność w pandach?
- 23. Czy porządek w deklaracji wielowymiarowej macierzy ma wpływ na zużytą pamięć?
- 24. Czy deklarowana wielkość pola varchar ma wpływ na PostgreSQL?
- 25. domyślna widoczność członków/członków klasy C++
- 26. C++ Czy poprawnie wywoływać "atrybuty" członków klasy?
- 27. Poleć członków klasy podstawowej z klasy pochodnej
- 28. Wpływ wartości zmiennoprzecinkowej na właściwości CSS
- 29. Wpływ rozmiaru pakietu na wydajność w Oracle 10g
- 30. Jak zmienić kolejność członków przy pomocy Resharper?
Wow, nie zdawałem sobie z tego sprawy, ale wysłałem tę odpowiedź 112 * sekund * po wysłaniu pytania! – Potatoswatter
@Potatoswatter_cool achievement !!! – Pooria
Również jego rozmiar może mieć znaczenie. Ponieważ procesor x86 (i prawdopodobnie wiele innych) ma specjalne kody operacji dostępu do pamięci z rejestrem indeksu, dostęp do tablicy obiektów o rozmiarach 1, 2, 4 lub 8 bajtów będzie uzyskiwany szybciej. – ruslik