比较两个类的内存布局
Comparing the memory layout of two classes
确保C++类符合我对其数据成员布局的期望的最佳方法是什么?
我需要和第三方图书馆的一个班一起工作。我知道这个类是standard_layout
,并且我知道它包含某些公共数据成员(具体地说,我在这里谈论的是C结构)。然而,我不一定知道成员在结构中的排列顺序,也不知道是否有额外的数据成员。
我需要能够断言数据成员是按特定顺序排列的,并且没有额外的成员,因为我的目标是将这个结构放入并集中,并使用9.2中关于并集的公共初始序列的特殊规则。最好,我希望这是某种类型的static_assert
,但使用小型测试程序在构建系统中进行检查也是可以接受的。
我曾考虑使用ofssetof
宏来检查成员的顺序,但我有点不知道如何确保填充中没有隐藏其他成员。
编辑
我想换个说法是:
- 我可以检测C结构的声明顺序吗(前提是我知道它的成员的名称)
- 我能检测到除了我所知道的成员之外还有其他成员吗
使用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");
因此:
是的,你可以知道订单。
是的,如果没有填充。
相关文章:
- C++继承的虚拟类的内存布局
- 检查nullptr是否100%保护内存布局不受segfault影响
- C++ Python 的扩展 - 安全内存访问和内存布局
- 类似元组的类模板的反向内存布局
- 在C++标准中记录对象的内存布局的哪个位置?
- C++ Lambda 的内存布局
- 打包类的内存布局 + 继承
- 假设传递给 OpenGL 的结构数组的内存布局存在潜在错误
- COM 互操作结构定义与内存布局不匹配
- C++非虚拟类成员变量内存布局?
- 结构中的内存布局差异
- 2D 区域的内存布局
- 如果"原子"<T>是无锁的并且与"T"的大小相同,内存布局是否相同?
- 是C 单继承的内存布局与此C代码相同
- 直观的内存布局,可实现快速SIMD/面向数据的设计
- 使用GDB并检查Data的内存布局
- 对齐方式究竟如何影响内存布局和新放置的巴哈维?
- 数组向量的内存布局是什么
- 为什么C 标准专门为具有不同访问说明符的类数据成员的内存布局提供了余地
- C++对象内存布局