我想在tuple
中存储三种类型:int
,float
和std::vector<double>
如果我把后续界面的问题放在一边,那么这个
tuple<int, float, vector<int>> t;
与此有任何不同
tuple<vector<int>, int, float> t;
由于tuple
作为一类可变基数的实现,我希望生成的类具有不同的布局,但在任何基础上都很重要方式?当在tuple
中放置类型时(例如,放置最大的第一个等),还有任何优化注意事项需要考虑吗?
答案 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>
的语义。但是,我不知道实际执行此操作的任何实现,因为难以在生成良好布局的顺序中排列一组类型。
不同的参数顺序可能会产生不同的布局。如果这很重要取决于您的用例。如果要在此进行优化,则应考虑目标体系结构的大小限制(附加填充)和缓存行大小。