问题1:
针对下面结构体 , 内存占用多少字节?
struct Struct1{
char a;
int b;
short c;
}struct1;
答案:
12字节
解释:
首先要知道内存对齐原则
-
数据成员对齐可以理解为
min(m, n)公式
, 其中m表示当前成员开始位置, n表示当前成员所需要的位数。如果满足m
整除 n (m % n == 0
),n
从m
位置开始存储, 反之m
循环+1
, 直至可以整除, 从而确定了当前成员位置。 -
结构体的
内存大小
必须为结构体最大成员
内存大小的整数倍
, 不足需要补齐
那么有
-
char
类型占1字节
, 初始位置0开始放char
, 占位(0) -
int
类型占4字节
, 起始位置4开始放int
, 占位(4, 5, 6, 7) -
short
类型占2字节
, 起始位置8开始放short
, 占位(8, 9) - 最大成员
int 4字节
, 所以补齐到4的整数倍
, 结果12
验证:
问题1 验证问题2:
针对下面嵌套结构体 , 结构体2(struct2)占用多少字节?
struct Struct1{
char a;
int b;
short c;
}struct1;
struct Struct2{
int a;
double b;
char c;
struct Struct1 struct1;
short d;
}struct2;
答案:
40 字节
解释:
建议先做下"问题一"
首先要知道内存对齐原则
-
数据成员对齐可以理解为
min(m, n)公式
, 其中m表示当前成员开始位置, n表示当前成员所需要的位数。如果满足m
整除 n (m % n == 0
),n
从m
位置开始存储, 反之m
循环+1
, 直至可以整除, 从而确定了当前成员位置。 -
结构体的
内存大小
必须为结构体最大成员
内存大小的整数倍
, 不足需要补齐 -
数组成员为结构体, 当结构体嵌套结构体时, "成员"的结构体的自身长度为"成员"结构体中最大成员的内存大小, 例如结构体a嵌套结构体b,b中有char、int、double等,则b的自身长度为8
那么有
-
int
类型占4字节
, 初始位置0开始放int
, 占位(0, 1, 2, 3) -
double
类型占8字节
, 起始位置8开始放double
, 占位(8, 9, 10, 11, 12, 13, 14, 15) -
char
类型占1字节
, 起始位置8开始放char
, 占位(16) -
struct1
内部最大成员为int
类型, 固需要按4字节对齐
, struct1整体占12字节
固起始位置20开始放struct1
, 占位(20~31), 其中struct1内:char a
占位(20),int b
占位(24, 25, 26, 27),short c
占位(28, 29), 30~31为结构体struct1
内部补齐 -
short
类型占2字节
, 起始位置32开始放short c;
, 占位(32, 33) -
最大成员
double 8字节
, 所以补齐到8的整数倍
, 结果40
验证:
问题2验证(持续更新....)
网友评论