std :: tuple参数中的类型顺序是否有任何影响?

Nik*_*iou 11 c++ tuples c++11

说我要来存储三种类型的tuple:int,floatstd::vector<double>

如果我抛开后续界面的问题,就这样做

tuple<int, float, vector<int>> t;
Run Code Online (Sandbox Code Playgroud)

与此有任何不同

tuple<vector<int>, int, float> t;
Run Code Online (Sandbox Code Playgroud)

由于tuple作为一类可变参数的实现,我期望生成的类有不同的布局,但它有什么关系吗?在将类型放入a tuple(例如,放置最大的第一个等)时,是否还要考虑任何优化注意事项?

R. *_*des 15

该标准不对类型的实际布局施加任何限制.订单影响的唯一事情是结果std::get<N>,std::tuple_element<N, T>等等.

我知道libstdc ++和Visual C++按照给定顺序的相反顺序排列类型; libc ++按给定顺序列出类型.这实际上意味着没有可移植的方式来选择始终产生最佳布局的订单.

但是,其他订单也是可能的.允许实现实现具有总是产生最小大小但仍保留相同语义的布局的元组std::get<N>,依此类推.但是,我不知道有任何标准的库实现.

  • @NikosAthanasiou那里只有N!不同类型的安排.编写一个元程序,从那些N中找到最小的`std :: tuple`!不同的安排,并将其与您的选择进行比较,并且`static_assert`s您的选择是最小的.然后你至少会收到一条错误信息.(注意:大N不适用) (4认同)
  • @NikosAthanasiou如果你按照我的回答中的链接你会看到我已经记录了我自己的冒险经历,你可以找到你所有疑虑的答案:)好吧,除了我还没有采取的`tuple_cat`描述的时间(这是该死的杂乱).类型的大小对于最佳布局并不重要; 对齐是.您应该这样做,以便按降序顺序物理存储类型. (2认同)
  • @Yakk"只有N!" - 现在,你每天都听不到的东西! (2认同)