为什么tuple和struct内存布局是相反的

fesdobat 2017-02-18 05:20:34

struct D3
{
float x, y, z;
};

struct D4
{
float x, y, z, w;
};
void main()
{
using A = tuple<D3, D4>;
struct A2
{
D3 a;
D4 b;
};
A a[] = {
{{1,2,3},{4,5,6,7} },
{{1,1,1},{ 0,0,0,0 } }
};

float* p = (float*)a;
for(size_t i = 0; i < sizeof(a)/sizeof(float); i++)
{
cout << *p << ' ';
p++;
}
}

测试结果struct A2是D3在前,D4在后;
而tuple是D4在前,D3在后。

按理说,tuple的设计目标之一就是减少小而杂的struct的使用,
应当和struct越接近越好;

为什么要在内存布局上和struct相反呢?
又不是做不到顺序一致。我觉得是可以做到的啦。

如果确实是tuple从实现上就是做不到按照参数申明的顺序来布局内存,
希望有人可以明确地告诉我;
如若不然,希望有人能说出tuple这样实现的目的和意图。
...全文
326 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fesdobat 2017-02-19
  • 打赏
  • 举报
回复
我的vs2015替我告诉我了答案: 如果类模板偏特化的参数是一个包扩展,则它应是最后一个参数。 看来目前规则就是这样了,也许等到c++17会有所改变。 此贴终结。
fesdobat 2017-02-19
  • 打赏
  • 举报
回复
@pengzhixi 所以我的问题是为什么VS的实现不是 template<class... _Rest, class Tail> class tuple<_Rest... , Tail>: private tuple<_Rest...> 突然想到 变长参数包好像只能出现在模板最末端。 好像有这么一条规定。 需要check
fesdobat 2017-02-19
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
标准并没有对tuple的布局有明确规定吧,所以你的这种用法属于未定义行为。
需要check
pengzhixi 2017-02-18
  • 打赏
  • 举报
回复
我们看一下vs的tuple实现 template<class _This, class... _Rest> class tuple<_This, _Rest...>: private tuple<_Rest...> 首先这是一个实现继承,并且这个继承随着参数包的扩展会形成一个继承链,每一次展开会解析出一个参数。这个展开顺序是从参数包的左边第一个开始,通过编译期的递归展开直到最右边的一个参数。这样形成的结果就是最右的参数会成为这个继承链的最基础的那个基类。举个例子来说tuple<int, double,char> 展开之后就是tuple<int>:private tuple<double>:private tuple<char>这样一个继承链。
幻夢之葉 2017-02-18
  • 打赏
  • 举报
回复
还有tuple并不显示提供内存的直接操作 使用tuple请用STL提供的接口
幻夢之葉 2017-02-18
  • 打赏
  • 举报
回复
标准并没有对tuple的布局有明确规定吧,所以你的这种用法属于未定义行为。 C++11 tuple的元素个数可以大于以前版本的10个 VS下tuple实现为递归继承(我不清楚是否有这个说法,递归继承只是我用来表述这种情况),具体如下 tuple<this, ...argv): tuple<...argv){ } //每次继承,依次减少一个参数 那么可以推断出,第一个元素位于最底层的派生类,最后一个元素位于最顶层基类 假如内存布局为:基类对象位于最开始的位置,然后派生类依次排列,那么就出现这种反过来的顺序 (注意:标准也没有对类对象的布局有规定(POD结构除外),由各自编译器厂商规定) 总结:逆序的情况只是基于该编译器的具体实现

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧