gpt4 book ai didi

c++ - 比较两个类的内存布局

转载 作者:行者123 更新时间:2023-11-30 04:10:41 24 4
gpt4 key购买 nike

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

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

我需要能够断言数据成员是按特定顺序排列的,并且没有额外的成员,因为我的目标是将这个结构放在一个 union 中,并使用 9.2 中关于公共(public)首字母的特殊规则 union 的顺序。我希望这是某种类型的 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. 是,如果没有填充。

关于c++ - 比较两个类的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com