A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dongkuan 中级黑马   /  2016-6-13 20:18  /  1734 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. 偏移量对齐
当前元素首字节偏移量必须是当前类型所占字节数的整倍

2. 总字节数对齐
总字节数,必须是占用字节数最大数量的整倍
                          关键第 1 句什么意思,好抽象!!!!!!

2 个回复

倒序浏览
本帖最后由 M.W 于 2016-6-19 10:50 编辑
结构体数据成员对齐的意义
许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被 称为该数据类型的对齐模数(alignmentmodulus)。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。
比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类
型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上。

计算结构体变量在内存中占用的字节数的方法:

1)先找对齐模数
对齐模数:是结构体中基本数据类型中占用字节数最大的那个
2)再计算结构体变量中各成员占用的字节之和
剩余分配的空间如果足够装得下下一个元素,那么就装,装不下就再分配一个对齐模数整数倍的空间(定义变量顺序会有影响(但不常见))
  1. struct A{
  2.         char a; //1
  3.         char b; //1
  4.         float c; //4
  5.         //-->模数是4,4可以装下a和b,所以A占用的是8个字节
  6.     };
  7.    
  8.     struct B{
  9.         char a[13]; //13
  10.         char b; //1
  11.         int c; //4
  12.         //模数是4,a[13]占用4个模数:4 * 4 = 16,剩下的3个字节可以装得下成员b,所以,B的大小时20
  13.     };
  14.    
  15.     struct C{
  16.         char *a; //8
  17.         int *b; //8
  18.         int c; //4
  19.         //模数是8,8 * 3 = 24
  20.     };
  21.     //定义结构体变量
  22.     struct A a;
  23.     struct B b;
  24.     struct C c;
  25.     printf("sizeof(a) = %ld\n", sizeof(a)); //8
  26.     printf("sizeof(b) = %ld\n", sizeof(b)); //20
  27.     printf("sizeof(c) = %ld\n", sizeof(c)); //20
复制代码
--如有不妥或错误之处,望提出指正

回复 使用道具 举报
亲,你不是擅长蒙嘛,可以接着{:2_40:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马