Я не вспоминаю доклад Андрея Александреску GoingNative 2012 точно , но он говорил об этом, и одним из упомянутых им пунктов было расположение памяти. Если у меня есть std::tuple<int, short, char, char>
, он будет в памяти как char, short, int
, и этот макет займет (в моей системе) на 4 байта больше, чем если бы он был выложен как int, short, char
. R. Мартиньо Фернандес напомнил мне, что лучше всего 1009 * упорядочить их в памяти в порядке, который минимизирует заполнение, что не является ни порядком, заданным , ни обратным порядком. (Наивное наследование делает обратный порядок).
Если я напишу std::tuple<int, char, short, char>
, кортеж, работающий по наивному наследованию, разместит их в памяти в порядке char, short, int
, используя 3 байта заполнения, когда оптимальное имеет нулевые байты заполнения. (Либо int, short, char, char
, либо char, char, short, int
).
Если предположить, что я прав, что речь идет о заполнении, то Р. Мартиньо Фернандес сказал"[мой аргумент] не исключает использования рекурсивного наследования для фактической реализации в оптимальном порядке.", вот почему я указываю, что наивное наследование плохое.
(порядок в памяти не означает, что get<0>
даст другой объект, и Р. Мартиньо Фернандес правильно отмечает, что порядок должен быть невидимым для пользователя. Однако это были точки как мне напомнили из события GoingNative.)
Видео на http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Variadic-Templates-are-Funadic, а слайды на http://ecn.channel9.msdn.com/events/GoingNative12/GN12VariadicTemplatesAreFunadic.pdf.