C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 普通旧数据 – 对齐要求大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有两个具有相同初始序列成员的POD结构A和B,但稍后会有一些差异(我知道,这可以通过继承轻松解决).

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])说

在这里@L_696_5@一个额外的例子.

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,请注明来意。