Podczas czytania this byłem zaskoczony tym, jaki poziom metaprogramowania może zrobić dla twojego układu klas. Muszę przyznać, że nie w pełni zrozumieć, co jest proponowane optymalny układ, gdybym miał stwierdzić, co zrozumiałem, to byłoby to:Czy implementacje krotek mają zoptymalizowany układ?
zamawiania członkiem klasy schodząc wyrównanie czyli typu z największą
alignof
wyniku idzie pierwszy itp.
Możesz mnie poprawić, jeśli coś jest nie tak (gdybyś miał krótkie wyjaśnienie, dlaczego tak się stanie, byłoby jeszcze lepiej, nie mogłem skopiować wklejonych fragmentów uzasadnienia w moim pytaniu) , ale moje pytanie dotyczy innego tematu:
Czy jakakolwiek implementacja biblioteki std::tuple
ma taką optymalizację układu?
Jeśli nie, czy istnieją jakieś standardowe typy danych algebraicznych, które to robią, czy istnieje inny sposób, aby to zrobić dla mojej klasy, oprócz pisania takiej maszyny?
Proszę wyjaśnić, dlaczego zamawianie przez zstępujące wyrównanie byłoby optymalnym układem? –
@LorahAttkins: To heurystyka, która często działa. Zakłada on, że sama klasa jest zazwyczaj maksymalnie wyrównana, więc umieszczenie maksymalnie wyrównywanych członków gwarantuje brak bajtów dopełniających między maksymalnie wyrównanymi członkami. Następnie przejdź do kolejnych największych elementów linii trasowania i ta sama logika zostanie zachowana. Gdy zabraknie członków, zazwyczaj dodaje się dodatkowe dopełnienie, aby zaokrąglić sizeof (your_class) do wielokrotności wyrównania klas. Czasami sztuczka "rzucaj po" oszczędza ci bajty, a czasem nie. Jest to dobre narzędzie do korzystania z zestawu narzędzi. –
Powinienem był dodać do mojego komentarza powyżej: Wielkość każdego typu jest wielokrotnością wyrównania dla tego typu. Na przykład nie ma czegoś takiego jak typ z wyrównaniem 16 bajtów i rozmiarem 15 lub 17. Jego rozmiar będzie 16, lub 32, lub 48 itd. Oznacza to, że zarówno 'i a' * i *' i a + 1' są wskaźnikami z wyrównaniem co najmniej tak dużym, jak "alignof (a)". –