一. 基本原则

1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的;

2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长的变量

3. 内存对齐与编译器设置有关。

二. 计算规则(以下的所有规则,必须同时满足,并不是满足其中一条即可)

1. 每个成员变量相对于struct起始地址的偏移量,必须是成员变量自身类型长度的最小整倍数

int number;是声明的第一个成员变量,相对于S001起始地址的偏移量为0

double tmp; 是声明的第二个成员变量,类型double长度8,根据规则1偏移量必须是8的最小倍数,当前偏移量是4,需要补充4个字节,则偏移量为8

2. 结构体内存大小,必须是成员变量中类型长度最长者的整倍数,如果不是,则在最后一个成员变量后补齐

根据1,int number和double tmp在内存中样式如下:

char c;是声明的第三个成员变量,类型char 1字节,偏移量为16

现在内存是17个字节,结构体S002中成员变量double tmp类型最长8个字节,17不能整除8,能整除8的最小数是24,则在char c后填补7个字节到24个字节

3. 成员变量是数组时,按照类型长度对齐,而不是数组长度对齐

int number;是声明的第一个成员变量,相对于S001起始地址的偏移量为0

char c[10];是声明的第二个成员变量,类型char 1字节,数组长度10,注意是按照类型char 1字节计算偏移量,偏移量4

double tmp; 是声明的第三个成员变量,类型double长度8,根据规则1偏移量必须是8的最小倍数,当前偏移量是14,需要补充2个字节,则偏移量为16

一共24字节,是最大类型double长度8的整倍数

4. 成员变量是结构体时,根据struct基本原则,其存储偏移量必须是成员变量中最长的数据类型的整倍数(当进行规则2的判断时,结构体变量也是使用成员变量中最长类型,结合上边几条规则,这个其实很好理解的)

这里运行3组数据进行验证:

  4-1> 如下图所示,结构体S004中结构体成员变量 S041 s41,结构体S041中成员变量的类型最长是1,因此s41的偏移量为14

  4-2> 下图为另一组结果图, 结构体S004中结构体成员变量 S041 s41,结构体S041中成员变量的类型最长是int 4,S004.c[10]的偏移量为4,长度为10,即结束位置是14,14不能整除4,因此S004.s41的偏移量补齐到16

  4-3> 下图中结构体S041中成员变量的类型最长是int 4,S004.c[10]偏移量为16,长度10,即结束位置为26,26不能整除4,所以补齐到28

5. 成员变量是联合体时,union的基本原则与struct一样,其存储偏移量必须是成员变量中最长的数据类型的整倍数,并且当进行规则2的判断时,联合体变量也是使用成员变量中最长类型(关于union的基本介绍,请看这里http://www.cnblogs.com/xieyajie/p/8086861.html

最新文章

  1. CentOS 6.4下编译安装MySQL 5.6.14
  2. table清除样式大全
  3. mysql 更改自动增长字段值的重新设定
  4. quartz源码解析(一)
  5. Spark 1.60的executor schedule
  6. SGU185 - Two Shortest
  7. iOS-学习路线图(推荐)
  8. Unity3d fur真实毛发渲染
  9. PHP IDE 框架 服务器 相关
  10. (收藏)KMP算法的前缀next数组最通俗的解释
  11. C++笔记(to be cont'd)
  12. intellij idea打jar包时的注意事项
  13. C语言学习及应用笔记之七:C语言中的回调函数及使用方式
  14. 记录C#常用的代码片段
  15. 提升 PLSQL 开发性能漫谈
  16. 8、Curator的监听机制
  17. vsftp安装与配置for Linux
  18. 【微软2014实习生及秋令营技术类职位在线測试】题目2 : K-th string
  19. tomcat https 支持android 6.0及以上版本的配置方法
  20. Mac使用终端安装Homebrew(brew)

热门文章

  1. [WIP]webpack 概念
  2. 模板 - 洲阁筛 + min25筛
  3. Android studio改包名
  4. IDEA快捷的添加包名
  5. 单片机C基本编程规范
  6. django (四) model模型
  7. python入门之数据类型之字符串
  8. JAVA常用知识总结(九)——线程
  9. [已读]高性能JavaScript
  10. Jquery多选框互相内容交换