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

时间:2014-05-28 11:17:19

标签: c++ c++11 tuples

我想在tuple中存储三种类型:intfloatstd::vector<double>

如果我把后续界面的问题放在一边,那么这个

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

与此有任何不同

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

由于tuple作为一类可变基数的实现,我希望生成的类具有不同的布局,但在任何基础上都很重要方式?当在tuple中放置类型时(例如,放置最大的第一个等),还有任何优化注意事项需要考虑吗?

3 个答案:

答案 0 :(得分:15)

标准对类型的实际布局没有任何限制。订单影响的唯一事项是std::get<N>std::tuple_element<N, T>等的结果。

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

但其他订单也是可能的。允许实现implement tuple with a layout that always produces minimal size但仍保留std::get<N>的相同语义,依此类推。但是,我不知道这样做的任何标准库实现。

答案 1 :(得分:1)

该标准未指定std::tuple的实施。但是,它保证std::tuple<A,B,C>应该是与std::tuple<B,A,C>不同的类型。 std::tuple是一个有序的类型列表。

boost::fusion为类型的设置样式容器提供数据类型,适用于订单不重要的情况:boost::fusion::set<>

答案 2 :(得分:0)

标准没有指定应该如何实现tuple,并且完全有可能实现重新排序参数以产生更好的布局,同时保留std::get<int N>的语义。但是,我不知道实际执行此操作的任何实现,因为难以在生成良好布局的顺序中排列一组类型。

不同的参数顺序可能会产生不同的布局。如果这很重要取决于您的用例。如果要在此进行优化,则应考虑目标体系结构的大小限制(附加填充)和缓存行大小。