Standard C++ 11 nakazuje zamawianie w pamięci dla niestatycznych członków danych klasy, a następnie specjalnie wyróżnia wyjątki dla członków o różnych specyfikacjach dostępu.Dlaczego standard C++ zapewnia konkretnie swobodę dotyczącą układu pamięci elementów danych klas z różnymi specyfikatorami dostępu?
Dlaczego jednak?
§ 9.2.13
Nonstatic członkowie danych o (non-union) o tej samej klasy kontroli dostępu (klauzula 11) są przydzielane tak, że później członkowie mają wyższe adresy w obrębie obiektu klasy. Kolejność przydzielania niestatycznych elementów danych z różną kontrolą dostępu jest nieokreślona (Rozdział 11). Wymogi dotyczące dostosowania w celu wdrożenia mogą spowodować, że dwóch sąsiednich członków nie zostanie przydzielonych bezpośrednio po sobie; więc może wymagać miejsca na zarządzanie funkcjami wirtualnymi (10.3) i wirtualnymi klasami bazowymi (10.1).
Ta część normy pojawiła się na stackoverflow wcześniej, ale nie sądzę, że kiedykolwiek została wyjaśniona.
Większość układu miała związek z kompatybilnością z C. Zostało zaostrzone w celu uzyskania większych gwarancji; jak przypuszczam, może istnieje kompilator, który robi porządek przez publiczne/prywatne/chronione przez dzikie? A inne, które nie? – Yakk
@Yak Naprawdę wygląda na to, że nie może istnieć "głęboki" powód tego i miał on po prostu opisać istniejące kompilatory w czasie pierwotnej standaryzacji. Z drugiej strony ta część standardu została subtelnie zmieniona na C++ 11, co jest kompletnie kłopotliwe. – Praxeolitic
Jest znacznie starszy niż C++ 11, przechodzi całą drogę z powrotem do C++ 98 (choć nieco przeformułowany). Gromadzenie IMO przez dostępność jest po prostu tanim sposobem na poprawę lokalizacji odniesienia, co jest bardzo ważne, aby efektywnie wykorzystywać pamięci podręczne procesorów. –