关于VC下结构体内存对齐问题

来源:互联网 发布:电商搜索排序算法 编辑:程序博客网 时间:2024/04/28 11:49
#include <stdio.h>//pragma pack(8)int main(){struct key{  int a;char b;long double c;char d;}kk;struct key1{int a;char b;int c;}kk1;struct key2{char a;char b;char c;}kk2;printf("%d\n",sizeof(struct key));printf("%d\n",sizeof(struct key1));printf("%d\n",sizeof(struct key2));printf("%p %p %p %p\n",&kk.a, &kk.b, &kk.c, &kk.d);printf("%p %p %p\n",&kk1.a, &kk1.b, &kk1.c);printf("%p %p %p\n",&kk2.a, &kk2.b, &kk2.c);return 0;}

输出结果:










1. key的长度是24个字节的存储空间,key1是12个字节,key2是3个字节;key中最大的成员long double类型变量是c,大小是8个字节,key1中最大的成员变量是int类型变量,大小是4个字节,key2最大的是char类型变量,大小是1字节。所以我们可以知道每个结构体的对齐系数是自己最大的成员变量。key是8,key1是4,key2是1.

2. 观察三个结构体成员变量的地址:

key.a的地址是28,key.b是2c,key.c是30,key.d是38:a是Int类型,占4个字节,所以b的地址是2c,c的大小是8个字节,第一个8空间已被a和b占去5个字节大小,容不下c,所以c重启一个8空间,所以其地址是在结构体首地址+8,c刚好占满一个8空间,所以d需要重启一个8空间,地址是首地址+8+8.

key1.a的地址是14,key.b是18,key.c是1c:同理,对齐系数是4.  


0 0