数据类型
基本数据类型所占空间(unsigned无符号类型相同):
- char:1字节
- short:2字节
- int (long):4字节
- double (long long):8字节
联合体union内存对齐:
- 大小足够容纳最宽的成员;
- 大小能被其包含的所有基本数据类型的大小所整除。(是被数据类型的大小:1,2,4,8,不是变量大小 )
方法:
- 内存大小只取决于最大的成员
- 找到占空间最大的成员,取最大的空间值X
- 当X无法被所有的数据类型大小所整除,就补加A,使得X+A可以被所有的数据类型大小所整除
- 则X+A为union的大小
例1:
union union1
{
char a; //类型大小1字节,变量大小1字节
short b; //类型大小2字节,变量大小2字节
int c; //类型大小4字节,变量大小4字节
double d; //类型大小8字节,变量大小8字节
};
union1取最大的变量,和其他变量无关
a-----------1
b-----------2
c-----------4
d-----------8
最大的是double=8,
8 mod 1=0
8 mod 2=0
8 mod 4=0
8 mod 8=0
所以union1的内存大小为8
例2
union union2
{
char a[13]; //类型大小1字节,变量大小3字节
short b; //类型大小2字节,变量大小2字节
int c[2]; //类型大小4字节,变量大小8字节
};
union2取最大的变量,和其他变量无关
a-----------13
b-----------2
c-----------8
最大的是a 13
13补3=16
16 mod 1=0
16 mod 2=0
16 mod 4=0
16 mod 8=0
所以union2的内存大小为16
结构体struct内存对齐:
- 结构体在内存中存放是按单元存放的,
- 所开辟单元的最大长度取决于占字节最大的数据类型,
- 存储顺序对空间的使用率有一定的影响。
方法
- 先找最大的是数据类型大小X
- 在最大的变量之前,只要不超过最大变量的长度,就堆在一起成一行
- 每一行不是X的倍数,就补齐到最近的X的倍数
- 之后加和为总的大小
例1
struct tagPhone1
{
char A;
int B;
short C;
};
tagPhone1 内存状态
A 类型大小1字节,变量大小1字节
BBBB 类型大小4字节,变量大小4字节
CC 类型大小2字节,变量大小3字节
只用看最大的类型:int
则最小单位为4字节,每次开辟新的单元必须是4字节的整数倍
开辟了三行
内存大小为 3*4 = 12
所以tagPhone1 的大小为12
例2
struct tagPhone2
{
char A;
short C;
int B;
};
tagPhone2 内存状态
ACC 类型大小1字节,变量大小1字节
BBBB 类型大小4字节,变量大小4字节
只用看最大的类型:int
则最小单位为4字节,每次开辟新的单元必须是4字节的整数倍
开辟了2行
内存大小为 2*4 = 8
所以tagPhone2的大小为8
例3
struct tagPhone3
{
char A;
char B[2];
char C[4];
};
tagPhone3 内存状态
ABBCCCC
只用看最大的类型:char
所以tagPhone3的大小为1+2+4=7
例4
struct tagPhone4
{
int a;
double b;
char c[9];
};
tagPhone4 内存状态
AAAA
BBBBBBBB
CCCCCCCCC
只用看最大的类型:double
需要成为8倍数
所以(4补4=8)+8+(9补7=16)=8+8+16=32
所以tagPhone4的大小为32