Имеет ли тип порядок в аргументах std:: tuple какие-либо эффекты?

Скажем, я хочу хранить три типа в tuple: int, float и std::vector<double>

Если я оставлю в стороне вопросы последующего интерфейса, делает ли это

tuple<int, float, vector<int>> t;

имеют какие-либо отличия от этого

tuple<vector<int>, int, float> t;

Из-за реализации tuple как класса вариационных оснований я ожидаю различного макета для созданных классов, но имеет значение в любом случае? Также есть ли какие-либо соображения по оптимизации, которые следует учитывать при размещении типов в tuple (например, поставить самый большой первый и т.д.)?

Ответ 1

Стандарт не устанавливает никаких ограничений на фактическое расположение типов. Единственное, на что влияет порядок, - это результаты std::get<N>, std::tuple_element<N, T> и т.д.

Я знаю, что libstdС++ и Visual С++ выставляют типы в обратном порядке заданного порядка; libС++ излагает типы в указанном порядке. Это по существу означает, что нет никакого переносного способа выбора порядка, который всегда создает наилучший макет.

Другие заказы возможны. Реализация разрешена реализовать кортеж с макетом, который всегда создает минимальный размер, но при этом сохраняет ту же семантику для std::get<N> и так далее. Однако я не знаю никакой стандартной реализации библиотеки, которая делает это.

Ответ 2

В стандарте не указывается реализация для std::tuple. Однако он гарантирует, что std::tuple<A,B,C> будет другого типа, чем, например, std::tuple<B,A,C>. std::tuple - упорядоченный список типов.

boost::fusion предоставляет тип данных для контейнера заданного стиля типов, для случаев, когда порядок не важен: boost::fusion::set<>

Ответ 3

В стандарте не указано, как реализовать tuple, и вполне возможно, что реализация переупорядочивает аргументы для создания лучшего макета, сохраняя при этом семантику std::get<int N>. Тем не менее, я не знаю никакой реализации, которая на самом деле делает это, поскольку сложность набора типов в порядке, который создает хороший макет, сложна.

Вероятно, что другой порядок аргументов будет производить другой макет. Если это зависит от вашего прецедента. Если вы хотите оптимизировать здесь, вы должны рассмотреть ограничения размера (дополнительное дополнение) и размер строки кеша вашей целевой архитектуры.