我是zoro
分类: LINUX
2010-10-28 09:41:24
自然对齐:所谓自然对齐,就是基本 数据类型(如short,int,double)的变量不能简单地存储于内存中的任意地址处,它们的起始地址必须能够被它们的大小整除。例如:在32位平 台下,int和指针类型变量的地址应该能被4整除,而short变量的地址都应该是偶数,bool和char则没有特别的要求。
所以,基于这种CPU构架的平台,编译器将按照自然对齐的要求来为每个变量生成逻辑地址。
内存对齐:编译器会对变量的起始地址进行对齐,32位机器访问地址是4的倍数处的内存比较方便。
min(系统默认,数据本身)
================================
例:
#include
struct a
{
char b;
int c;
char d;
double e;
char f;
};
struct b
{
char b;
int c;
char d;
double e;
char f;
}__attribute__((packed)); //表示不对齐数据
int main()
{
printf("sizeof(a)=%d\n",sizeof(struct a));
printf("sizeof(b)=%d\n",sizeof(struct b));
return 0;
}
运行结果:
sizeof(a)=24
sizeof(b)=15
对于结构体a,
char b;//本身占一个字节,系统为对齐,填充3个字节,故用了4个字节
int c; //整型变量占4个字节
char d; //本身占一个字节,系统为对齐,填充3个字节,故占用4个字节
double e; //占用8个字节
char f; //本身占一个字节,系统为对齐,填充3个字节,故占用4个字节
故共占用24字节。
================
若把结构体a改成
struct a
{
int c;
char b;
char d;
char f;
double e;
};