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