您的位置:首页 > 编程语言 > C语言/C++

简单介绍C/C++中结构体内存对齐

2018-03-19 21:04 246 查看
C中结构体的内存规则并不是直接其属性的内存直接相加的,而是有一定规则的,也就是内存对齐规则;
一:结构体中第一个成员的偏移量是0,以后每个成员的位置是x的倍数;//x是各个属性的内存大小

二:成员对齐后,结构体自身也要对齐,按照y的倍数进行;//y是内存最大的属性的内存
比如:
struct m1{
char a;
int c;
double d;
}m1;
cout << sizeof(char) << " " << sizeof(int) << " " << sizeof(double) << endl; //结果是1 4 8;可是
cout << sizeof(m1)//结果是16
再比如
struct m2{
int c;
double d;
char a;

}m2;

cout <<  sizeof(m2);//结果是24
可以看到结构体的内存大小并不一定等于其属性的内存大小的和,就算属性相同先后次序不同,其结构体大小也可能会不同,这就是因为内存对齐这一机制。
结构体m1中a占1个字节,假设从地址0开始,则c本来会从地址1开始,可是c占4个字节,起始地址不是4的倍数,内存就会把起始地址往后移,也就是说移到地址4后,是4的倍数了,才开始存储c,同理d也是如此;
结构体m2中c占4个字节,假设地址也从0开始,则d会从4开始,可是4不是8的倍数,则移到8开始到地址15,然后a从16开始到地址17,但是17不是结构体属性中最大的属性double内存大小的倍数,所以加到24.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: