2016-12-31 7 views
6

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.

+0

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

+0

@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

+4

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. –

Odpowiedz

2

N2062 to pierwszy dokument C++, który zajmuje się zmianami w POD C++ 98/03. Został napisany jako sposób na rozwiązanie core issue 568, który dotyczy układów POD i typu. Przedstawia on początek projektu, który prowadzi do standardowego układu C++ 11 i banalnych definicji kopiowalności.

A jednak, N2062 nigdy nawet uważa, że ​​ definiuje układ członków z różnymi kontrolkami dostępu. Nie uzasadnia nawet, dlaczego to ograniczenie obowiązuje. Nie ma też the final version of that proposal, co w rzeczywistości daje nam trywialnie kopiowalne i standardowe definicje. Wszystkie wersje tych propozycji przyjmują ograniczenie kontroli dostępu jako fakt dokonany, a nie coś, co można by zmienić.

Wszystko to sugeruje, że autor wniosku miał wiedzę o co najmniej jednym kompilatorze/ABI, który zmienia kolejność członków na podstawie kontroli dostępu.

Powiązane problemy