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


说我想在a中存储三种类型 tuple : intfloat 和 std::vector<double>

如果我把后续接口的问题放在一边,这样做

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

与此有任何不同

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

由于执行 tuple 作为一类可变基数,我期待一个 不同的布局 对于制作的课程,但是 这有什么关系吗? ?在将类型放入a时,还需要考虑任何优化注意事项 tuple (例如把最大的第一个等)?


2425
2018-05-28 11:17


起源

@ user2485710:这是完全不同的事情...... - Lightness Races in Orbit
为什么OP没有使用字符串映射到std :: chrono :: milliseconds?有什么好处? - R. Martinho Fernandes
@ R.MartinhoFernandes我认为OP应该使用jQuery。避免它没有任何好处。 - Lightness Races in Orbit
@LightnessRacesinOrbit他应该使用凿子并手动雕刻他的显示器上的所有像素。 - Danvil
从性能的角度来看,订单可能非常重要。从第一个组件到最后一个组件比较元组。因此,例如,如果元组被用作地图关键字并且其组成的类型具有不同的比较复杂性,那么将“轻量级”类型放在第一位置并且“笨重”类型最后是更有利可图的。 - ach


答案:


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

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

但是,其他订单也是可能的。允许实现 使用总是产生最小尺寸的布局来实现元组 但仍保留相同的语义 std::get<N> 等等。但是,我不知道有任何标准的库实现。


15
2018-05-28 11:34



我正在做的(作为业余时间练习)是制作一个元素程序,它将“修复”元组布局并产生最佳类型。到目前为止,我假设首先放置最小的类型(例如,这是一个 相关问题 在此)是要走的路。您对订购有什么建议吗? - Nikos Athanasiou
@NikosAthanasiou如果你按照我的回答中的链接,你会看到我记录了我自己的冒险经历,你可以找到你所有疑虑的答案:)嗯,除了 tuple_cat 我还没有花时间来描述(这是该死的杂乱)。对于最佳布局,类型的大小并不重要;对齐是。您应该这样做,以便按降序顺序物理存储类型。 - R. Martinho Fernandes
哦,的确,会读!很棒的博客 - Nikos Athanasiou
@NikosAthanasiou那里只有N!不同类型的安排。写一个找到最小结果的元程序 std::tuple 从那些N!不同的安排,并将其与您的选择进行比较,并且 static_assert你的选择是最小的。然后你至少会得到一条错误信息。 (注意:大N不适用) - Yakk - Adam Nevraumont
@Yakk“只有N!” - 现在 有 你每天都听不到的东西! - Stuart Olsen


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

boost::fusion 在订单不重要的情况下,为类型的集合样式容器提供数据类型: boost::fusion::set<>


1
2018-05-28 12:08





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

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


0
2018-05-28 11:34