比较两个类的内存布局 P>什么是确保C++类符合我对数据成员的布局的期望的最好方法?< /P>

比较两个类的内存布局 P>什么是确保C++类符合我对数据成员的布局的期望的最好方法?< /P>,c++,c++11,C++,C++11,我需要与第三方图书馆的课程合作。我知道这个类是standard_layout,并且我知道它包含某些公共数据成员(具体来说,我在这里谈论的是C结构)。但是,我不一定知道成员在结构中的排列顺序,也不知道是否有额外的数据成员 我需要能够断言数据成员是按特定顺序排列的,并且没有额外的成员,因为我的目标是将此结构放入一个联合中,并使用9.2中关于联合的公共初始顺序的特殊规则。最好,我希望这是某种类型的静态断言,但是使用小型测试程序在构建系统中进行检查也是可以接受的 我曾考虑使用ofssetof宏来检查成员

我需要与第三方图书馆的课程合作。我知道这个类是
standard_layout
,并且我知道它包含某些公共数据成员(具体来说,我在这里谈论的是C结构)。但是,我不一定知道成员在结构中的排列顺序,也不知道是否有额外的数据成员

我需要能够断言数据成员是按特定顺序排列的,并且没有额外的成员,因为我的目标是将此结构放入一个联合中,并使用9.2中关于联合的公共初始顺序的特殊规则。最好,我希望这是某种类型的
静态断言
,但是使用小型测试程序在构建系统中进行检查也是可以接受的

我曾考虑使用
ofssetof
宏来检查成员的顺序,但对于如何确保填充中没有隐藏其他成员,我有点不知所措

编辑

我想重新表述这个问题的方式是:

  • 我是否可以检测C结构的声明顺序(前提是我知道其成员的名称)
  • 除了我知道的成员之外,我还能检测到其他成员的存在吗

  • 使用
    offset of
    ,您可以知道成员的顺序(和偏移量)

    使用
    sizeof
    ,您可以知道结构和每个成员的大小

    但是如果
    struct
    有填充,我看不到任何方法来检测是否有额外的参数

    struct S
    {
        char c;
        // char padding[3];
        uint32_t u;
    };
    
    static_assert(offsetof(struct S, c) == 0, "expected c at 0");
    static_assert(offsetof(struct S, u) == 4, "expected u at 4");
    static_assert(offsetof(struct S, c) < offsetof(struct S, u), "expected c before u");
    static_assert(sizeof(struct S) == 8, "expected size == 8");
    static_assert(sizeof(struct S) - (sizeof(S::c) + sizeof(S::u)) == 3, "expected 3 bytes of padding");
    
    结构
    {
    字符c;
    //字符填充[3];
    uint32_t u;
    };
    static_assert(offsetof(struct S,c)=0,“预期c为0”);
    static_assert(offsetof(struct S,u)=4,“预期u为4”);
    静态断言(offsetof(struct S,c)
    因此:

  • 是的,你可以知道订单

  • 如果没有填充,则为“是”


  • 你检查过这个了吗声明的顺序就是,声明的顺序。数据成员不会被重新排序,因为它很可能在某个点上被代码破坏。填充不会“隐藏”成员。我不确定自己是否解释正确,我知道原始结构包含某些数据成员A、B、C,但我不知道它们的声明顺序。我试图了解我是否能够检测到声明顺序和额外数据成员的存在,例如,在A和B之间声明。Oragon Efreet:感谢链接。我认为我对POD、标准布局类等之间的差异有一个合理的把握。但我将浏览FAQ,看看是否有任何关于我问题细节的提示。可以测试这一点的另一种方法是将结构归零,将每个成员设置为唯一值(0xaaaaaa,等等)-然后,您应该能够将结构复制到缓冲区(或强制转换它),比较每个字节,并计算出每个变量的位置,以及是否有任何未设置的填充字节。