比较两个类的内存布局

时间:2013-12-12 11:12:19

标签: c++ c++11

确保C ++类符合我对数据成员布局的期望的最佳方法是什么?

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

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

我正在考虑使用ofssetof宏来检查成员的顺序,但我对如何确保填充中没有隐藏其他成员感到有些不知所措。

修改

我想重新解释这个问题的方法是:

  1. 我可以检测C结构的声明顺序(前提是我知道其成员的名称),
  2. 除了我所知道的那些之外,我能否发现额外成员的存在?

1 个答案:

答案 0 :(得分:2)

使用offsetof,您可能知道该成员的顺序(和偏移)。

使用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");

所以:

  1. 是的,你可以知道订单。

  2. 是的,如果没有填充。