关于内存对齐的文章很多,大家上网搜一下会发现很多的文章讲的很细,我在这里就不多提,我主要提出一些我总结的一些关于这种体型的几个细节和做题依据。
1、我们内存对齐总是选择结构体中所占字节最大的数据类型大小作为对齐字节数
注意:我们的32位编译器默认是4字节,64位默认是8字节
2、我们结构体中每个数据的起始地址必须是本个数据类型的整数倍大小,例如int 类型数据的起始地址必须是4的倍数,char的话就随便,因为它的数据长度为1,所以在哪都可以,哪个起始地址都可以被1整除。
3、我们求sizeof的时候其实相当于一种宏替换如果你int c; 然后又求一次sizeof(c=1),c=1这条语句不会执行。
4、我们sizeof求结构体所占大小的时候,求的是它所占的栈内存的大小,如果它是static的那并不计算在内,因为它占的不是栈上的内存,而是数据段内存。
注意好上面的点,做这种题也就没有什么问题了,对了,如果你不想要用内存对齐,可以使用#pragma pack(1)自己消除内存对齐
例1:
int main()
{
//struct A aa;
int c = 4;
int a = sizeof(c=5);
printf("%d\n",c);
}
编译通过,并且结果输出为4.
例2:
#include<stdio.h>
struct A{
short a;
short b;
short c;
};
int main()
{
struct A aa;
printf("%d\n",sizeof(aa));
}
结果输出为6,但是我的结构体中最大的数据类型长度为,所以,只要最后的字节大小为2就可以了。
使用#pragma pack(1)消除内存对齐
#include<stdio.h>
#pragma pack(1)
struct A{
short a;
double b;
char c;
};
int main()
{
struct A aa;
//int c = 4;
//int a = sizeof(c=5);
printf("%d\n",sizeof(aa));
}
输出为11;
这里既然提到了32位和64位我们就给出数据类型所占字节数在两者下的区别