填充结构的实际大小,(成员大小的总和,没有用于对齐的填充)
Actual sizeof padded struct, (sum of member sizes, without padding for alignment)
sizeof() returns 结构大小,包括用于对齐的成员的填充。这很好。不需要将结构打包为 0 填充。
只需要获取(或计算)要比较的结构成员的大小之和(在静态编译时断言中使用它)。
当您的成员规模较小时,他们 absence/difference 不会被抓到。
成员主要是char数组
是否可以在编译时(或 运行 时)获得该数字?
或者我还能如何确保 'effective' 大小符合我的预期并避免因中断程序而意外更改?
初衷是为了避免A或B被误修改成不同的bug。
使用 STATIC_ASSERT( sizeof(A) == sizeof(B) )
由于填充,这不适用于某些 'small' 差异。
注意:A 和 B 应该相似,但在给定的设计中,不可能在程序的两个部分中重用 A。这个检查是为了确定如果有人只改变了A或者只改变了B,它就不能编译。
您可以 #include 相同的 header 两次。一次启用打包,一次不启用。显然,宏也会将打包结构的名称更改为与真实结构名称不同的名称。
举个例子。 header 文件,例如 test.h,如下所示。它显示了两个具有不同解压缩大小但相同打包大小的结构。
#ifdef ENABLE_PACKED
#define PACKED(x) __attribute__ ((__packed__)) x##_packed
#else
#define PACKED(x) x
#endif
struct PACKED(my_struct1) {
char c1;
int i1;
char c2;
int i2;
};
struct PACKED(my_struct2) {
char c1;
char c2;
int i1;
int i2;
};
#ifdef ENABLE_PACKED
_Static_assert(sizeof(struct my_struct1_packed) ==
sizeof(struct my_struct2_packed), "Error");
#endif
#undef PACKED
请注意,您实际上只需要在一个文件中定义 ENABLE_PACKED 和 #include test.h 即可测试静态断言。因此,您甚至可以只创建一个包含 test.h 两次的 dummy.c 文件,并让您的构建每次都编译 dummy.c 但实际上并不在任何实际版本中使用它 object。这样,您所有真正的 .c 文件甚至根本不需要知道这一点,并且可以正常包含所有 header 个文件。
sizeof() returns 结构大小,包括用于对齐的成员的填充。这很好。不需要将结构打包为 0 填充。
只需要获取(或计算)要比较的结构成员的大小之和(在静态编译时断言中使用它)。
当您的成员规模较小时,他们 absence/difference 不会被抓到。 成员主要是char数组
是否可以在编译时(或 运行 时)获得该数字?
或者我还能如何确保 'effective' 大小符合我的预期并避免因中断程序而意外更改?
初衷是为了避免A或B被误修改成不同的bug。 使用 STATIC_ASSERT( sizeof(A) == sizeof(B) ) 由于填充,这不适用于某些 'small' 差异。
注意:A 和 B 应该相似,但在给定的设计中,不可能在程序的两个部分中重用 A。这个检查是为了确定如果有人只改变了A或者只改变了B,它就不能编译。
您可以 #include 相同的 header 两次。一次启用打包,一次不启用。显然,宏也会将打包结构的名称更改为与真实结构名称不同的名称。
举个例子。 header 文件,例如 test.h,如下所示。它显示了两个具有不同解压缩大小但相同打包大小的结构。
#ifdef ENABLE_PACKED
#define PACKED(x) __attribute__ ((__packed__)) x##_packed
#else
#define PACKED(x) x
#endif
struct PACKED(my_struct1) {
char c1;
int i1;
char c2;
int i2;
};
struct PACKED(my_struct2) {
char c1;
char c2;
int i1;
int i2;
};
#ifdef ENABLE_PACKED
_Static_assert(sizeof(struct my_struct1_packed) ==
sizeof(struct my_struct2_packed), "Error");
#endif
#undef PACKED
请注意,您实际上只需要在一个文件中定义 ENABLE_PACKED 和 #include test.h 即可测试静态断言。因此,您甚至可以只创建一个包含 test.h 两次的 dummy.c 文件,并让您的构建每次都编译 dummy.c 但实际上并不在任何实际版本中使用它 object。这样,您所有真正的 .c 文件甚至根本不需要知道这一点,并且可以正常包含所有 header 个文件。