比较两个类的内存布局

Comparing the memory layout of two classes

本文关键字:内存 布局 两个 比较      更新时间:2023-10-16

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

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

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

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

编辑

我想换个说法是:

  1. 我可以检测C结构的声明顺序吗(前提是我知道它的成员的名称)
  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. 是的,如果没有填充。