为什么要内存对齐?内存对齐原则?如何判断大小端?
为什么要内存对齐?访问未对齐的内存,处理器要访问两次(数据先读高位,再度地位),访问对齐的内存,处理器只要访问一次,为了提高处理器读取数据的效率,我们使用内存对齐。Windows 默认对齐数为8字节,Linux 默认对齐数为4字节。使用内存对齐的原因还有平台的原因:不是所有的硬件平台都能访问特定的地址上的任意数据,某些平台只能访问特定的地址上的获取数据,否则会抛出异常。内存对齐原则...
·
为什么要内存对齐?
访问未对齐的内存,处理器要访问两次(数据先读高位,再度地位),访问对齐的内存,处理器只要访问一次,为了提高处理器读取数据的效率,我们使用内存对齐。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;
}
更多推荐
已为社区贡献1条内容
所有评论(0)