大佬教程收集整理的这篇文章主要介绍了c – 普通旧数据 – 对齐要求,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
struct A { int x; uint64_t y; int z; }; struct B { int x; uint64_t y; int8_t z; };
指向struct的指针需要指向intitial成员(§9.2.20[class.mem]).
现在另外两个问题:
>在标准中我发现成员不能重新排序.我很确定这是这种情况,因为结构需要与C完全兼容,并且对于C,规定内存地址必须按声明的顺序增加.
>两个结构中的共同成员的对齐必须相同吗?即,以下总是如此:
A a; B b; assert(offsetof(A,y) == offsetof(B,y));
如果不是:至少如果我把结构放入一个联合,那么这应该成立,因为标准(§9.2.19[class.mem])说
struct A { int x; uint64_t y; int z; }; struct B { int x; uint64_t y; int8_t z; }; B convertToB(A& a); void g() { A a; // at this point,I cAnnot rely on offset(A,y) == offset(B,y) B b = convertToB(a); // since I do the copy over the union,offset(A,y) holds } union U { A asA; B asB; }; B convertToB(A& a) { U u; // at this point,y) holds u.asA = a; return u.asB; }
由于我没有机会知道在某个时刻是否会发生关于联合的副本,并且结构必须在任何地方都相同,我声称,偏移量(A,y)==偏移量(B,y)必须保持不变.
在您的结构中,所有成员都具有相同的访问类,因此您可以在此处获得有关订单的保证.
但请注意引用的最后一句:不能保证两个连续成员之间的空间是相同的(虽然不太可能).这就是为什么我建议采用工会方法.您不仅可以从标准保证中受益,而且还可以在源代码中清楚地传达您的意图.
编辑
我们可以考虑另一个方面:POD类型是一种普通类型,并且具有标准布局.
一旦你的结构在某个时刻发散,你@R_467_10585@你没有任何保证.但是我知道这可以保证u.asB与它返回的B对象的布局兼容.
最后,我希望通过简单的可复制对象找到更实际的保证:
我认为可以从中推断出,在你的情况下,在联合中存储一个值但是读取另一个值会起作用.但请注意,根据此(非规范性)说明,这不是一般事实:
以上是大佬教程为你收集整理的c – 普通旧数据 – 对齐要求全部内容,希望文章能够帮你解决c – 普通旧数据 – 对齐要求所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。