Nie przypominam sobie przemówienia GoingNative 2012 Andrei Alexandrescu dokładnie, ale mówił o tym punkcie, a jednym z punktów, o których wspomniał był układ pamięci. Jeśli mam std::tuple<int, short, char, char>
, będzie on w pamięci jako char, short, int
, a ten układ zajmie (w moim systemie) 4 bajty więcej, niż gdyby zostały one ustawione jako int, short, char
. R. Martinho Fernandes przypomniała mi, że najlepszą rzeczą do zrobienia byłoby zamówienie ich w pamięci w kolejności, która minimalizuje dopełnienie, co nie jest ani porządkiem w kolejności ani kolejnością odwrotną. (Dziedziczenie naiwne ma kolejność odwrotną).
Jeśli piszę std::tuple<int, char, short, char>
, krotka, która działa przez naiwnego dziedziczenia byłoby umieścić je w kolejności char, short, int
w pamięci za pomocą 3 bajtów wypełnienia, gdy optymalna wynosi zero bajtów wypełnienia. (Albo int, short, char, char
lub char, char, short, int
).
Zakładając, że mam rację, że chodzi o dopełnienie, to R. Martinho Fernandes said "[moja argumentacja] nie wyklucza użycia rekurencyjnego dziedziczenia dla rzeczywistej implementacji w optymalnej kolejności.", Dlatego właśnie określić, że dziedziczenie naiwne jest złe.
(Kolejność w pamięci robi nie oznacza, że get<0>
da inny obiekt, a R. Martinho Fernandes słusznie zauważa, że kolejność powinna być niewidoczne dla użytkownika. Jednak były to punkty jak już przypomniano od zdarzenia GoingNative.)
Film jest dostępny pod numerem http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Variadic-Templates-are-Funadic, a slajdy mają numer http://ecn.channel9.msdn.com/events/GoingNative12/GN12VariadicTemplatesAreFunadic.pdf.
może ma to związek z nieefektywnym przekazywaniem argumentów? –
byłby prawdopodobnie pomocny, gdyby ktoś mógł przedstawić różnicę między tymi dobrymi a tymi, które są dobre. – PlasmaHH
@Cheers: Sądzę, że inlining poradziłby sobie z tym - ale z drugiej strony muszę przyznać, że * mam * uruchamiane kompilatory, które zdecydowały się zaprzestać wprowadzania na głębokość większą niż 3 lub 4. – Hurkyl