淘先锋技术网

首页 1 2 3 4 5 6 7

结构体大小?

一般的实现上结构体布局是这样(暂不计位域和柔性数组):

首个成员偏移是 0 (标准要求)。

后一个成员需要在前一个成员之后(标准要求)。其偏移是保证该成员不与前一成员重叠的该成员对齐的最小整数倍。

结构体的对齐是各个成员对齐的最大值。结构体的大小是能保证放下最后成员的对齐的最小整数倍。

标准允许结构体有更大对齐或布局更加“松垮”一点(有更多空隙),但实现一般不会这样。

一般实现上数组类型的对齐同元素类型。

这里的规则无论成员和元素是否为结构体都成立。

按题主描述,测试所用的平台使用 LP64 数据模型,short 大小与对齐均为 2 字节, int 大小与对齐均为 4 字节, long 及指针大小与对齐均为 8 字节。

struct P1 { int a; char b; int c; char d; };

a 偏移为 0 , b 偏移为 4 , c 偏移为 8 (大于 4 + 1 的 4 的最小整数倍), d 偏移为 12 。 P1 对齐为 4 ,大小为 16 。

struct P2 { int a; char b; char c; long d; };

a 偏移为 0 , b 偏移为 4 , c 偏移为 5 , d 偏移为 8 。 P2 对齐为 8 , 大小为 16 。

struct P3 { short a[3]; char b[3]; };

a 偏移为 0 , b 偏移为 6 。 P3 对齐为 2 ,大小为 10 。

struct P4 { short a[3]; char *b[3]; };

a 偏移为 0 , b 偏移为 8 (大于 0 + 6 的 8 的最小整数倍)。 P4 对齐为 8 ,大小为 32 。

struct P5 { struct P3 a[2];struct P2 t;};

a 偏移为 0 , t 偏移为 24 (大于 0 + 20 的 8 的最小整数倍)。 P5 对齐为 8 ,大小为 40 。

C 中类型大小可用 sizeof 获取,类型对齐可用 _Alignof 获取,成员偏移可用宏 offsetof 获取。

java c语言结构体,结构体大小