许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值 K(通常是 2、4 或 8)的倍数 k值取 = max{系统对齐大小 ,结构成员对齐大小} (对齐大小可人为设定)
内存对齐目的:是为了对齐数据以提高存储器的性能,加快内存的读取速度,提高寻址效率。
首先了解一下64位操作系统下不同类型数据所占字节数:
short : 2 字节
char : 1 字节 void * : 8 字节 unsigned char : 1 字节
short int : 2 字节 int : 4 字节 unsigned int : 4 字节 long int : 8 字节
float : 4 字节 double : 8 字节
long : 8 字节 long long : 8 字节 unsigned long : 8 字节
在C语言中:
struct A
{
} a ; sizeof(a) = 0; //空结构体
struct A
{
char a;
short b;
int c;
} a ; sizeof(a) = 8; 系统对齐2 + 2 + 4 = 8 是2的倍数
/*************************************************************/
{
char a;
long b;
} a ; sizeof(a) = 16; 系统对齐8 + 8 = 16
struct B
{
char c;
A d;
long long e;
} a ; sizeof(a) = 32; 系统对齐(最大)8 + 16 +8 = 32 32 = max(8 ,8) * n (n位整数)
max (系统对齐大小 ,结构体对齐大小)
/*************************************************************/
struct test
{
char a;
short b;
char c;
int d;
} test1 ; sizeof(test1) = 12; 系统对齐 char 2 + 2 + 系统对齐 char 4+ 4 = 12 12 是4的倍数
struct test2
{
short b;
char a;
char c;
int d;
}test 3; sizeof(test3) = 8;
struct A
{
char a;
short b;
int c;
struct B
{
ch ar d;
double e;
};
int f;
} a ; sizeof(a) = 12 系统对齐char 2+2+4+4 = 12 12是2的倍数
{
char a;
short b;
int c;
struct B
{
char d;
double e;
} f;
int g;
} a ; sizeof (a) = 32; 系统对齐char 2+2+4+(系统对齐 char 8 +8 = 16) + 4 = 28 max (2,8)=8 28+4=32 为8的倍数
内存对齐之结构体中添加位段:
struct B
{
char c1:6;
char c2:1;
int in:16;
}; sizeof (b) = 4
标记 c1,c2,in 分别需要 6位 1位 16位 一个字节8位
补充说明:
struct packed_struct
{
}; sizeof(structpackd_struct) = 4
当位段出现在结构定义中时, 至少会占用等同于unsigned int类型的空间,当所有的位段之和超出,分配另一个unsignedint空间。unsigned char或者其他类型不必考虑。
/************************************枚举类型*************************************/
struct A
{
enum a{
INDEX1,
INDEX2,
INDEX3,
INDEX4};
} a ; sizeof(a) = 0 枚举是类型不是变量不分配变量
/************************************联合体**************************************/
union B
{
short s1;
char c2;
short s2;
int in;
} b ;
union B
{
short s1:6;
char c2:1;
short s2:15;
int in:16;
} b ;
两个联合体 sizeof(b) 均为4