为什么要内存对齐?

       访问未对齐的内存,处理器要访问两次(数据先读高位,再度地位),访问对齐的内存,处理器只要访问一次,为了提高处理器读取数据的效率,我们使用内存对齐。Windows 默认对齐数为8字节,Linux 默认对齐数为4字节。
       使用内存对齐的原因还有平台的原因:不是所有的硬件平台都能访问特定的地址上的任意数据,某些平台只能访问特定的地址上的获取数据,否则会抛出异常。

内存对齐原则:

          在内存中,编译器按照成员列表分别为 每个结构体变量分配内存,当存储过程中需要对齐的需求时,编译器会在成员之间留下额外的内存空间。如果想要确认结构体占多少存储空间,则使用关键字sizeof查看大小,如果想得知结构体的某个特定成员在结构体的位置,则使用offsetof(头文件stddef.h)
          结构体或联合体的数据成员、第一个成员放到0片便宜的地方,以后每个数据成员放到自身对齐的整数倍偏移处。(对齐数是变量自身大小和默认对齐数的较小值)结构体的大小必须是最大对齐数的整数倍。

如何判断大小端

大小端原则:
大端:高字节放到低地址,低字节放到高地址
小端:高字节放到高地址,低字节放到低地址
顺口溜:小小小
//强制类型转换
int main(){
	int i=1;
	char *b=(char*)&i;
	if(*b==1){
		printf("little\n");
	}else{
		printf("big\n");
	}
	return 0;
}
// 联合体
int test{
	union judge{
		int i;
		char j;
	}u;
	u.i=i;
	return u.j;
}

int main(){
	int i=test();
	if(i==1){
		printf("little\n");
	}else{
		printf("big\n");
	}
	return 0;
}
Logo

更多推荐