转自:http://blog.csdn.net/wangyanguiyiyang/article/details/53312049

struct内存对齐问题

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:结构体总大小:也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

例1.

 typedef struct AA{
int aa1; //[0]....[3]
double aa2; //[8].....[15]
float aa3; //[16]..[19] 原则3:结构体总大小,总长要为8的整数倍,补齐[20]...[23]
};
typedef struct BB
{
char bb1[]; //[0],[1]
int bb2; //[4]...[7]         
double bb3; //[8]....[15]    
short bb4; //[16],[17]        
AA a; //[24]......[47] 原则2,内部对象为结构体      
};

结果:

  

union内存字节对齐

其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:

1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;

2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int   a[5]为4)不满足整除关系,该最大空间自动延伸;

我们来看看这段代码:

 union   mm{
char a; //元长 度1
int b[];//元长度4
double c;//元长度8
int d[];
};

本来mm的空间应该是sizeof(int)*5=20;但是如果只是20个单元的话,那可以存几个double型(8位)呢?两个半?

当然不可以,所以mm的空间延伸为既要大于20,又要满足其他成员所需空间的整数倍,即24 所以union的存储空间先看它的成员中哪个占的空间最大,拿他与其他成员的元长度比较,如果可以整除

最新文章

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
  2. windows中,端口查看&关闭进程及Kill使用
  3. Neil·Zou 语录一
  4. MySQL数据库sql语句的一些简单优化
  5. 分享Kali Linux 2016.2第36周镜像虚拟机
  6. javascript 金额格式化
  7. Oracle 学习笔记(三)
  8. (转)使用Aspose.Cell控件实现Excel高难度报表的生成(一)
  9. js给数字加三位一逗号间隔的两种方法(面试题)
  10. 心跳之旅—💗—iOS用手机摄像头检测心率(PPG)
  11. 图片上传,支持同步/异步、预览(MVC、uploadify异步提交、js预览、ajaxSubmit异步提交)兼容大部分浏览器,含代码
  12. 向老项目JSP集成JSTL遇到的问题
  13. 9.22 noip模拟试题
  14. WebSocket聊天室demo
  15. asp.net 获得客户端 mac 地址
  16. 解决Eclipse一直loading workbench无法启动的问题
  17. R语言的导数计算(转)
  18. 代码检查工具jshint和csslint
  19. GUI—ST_emWin移植
  20. HDFS Federation

热门文章

  1. 1.0Tensorflow中出现编译问题的解决方案
  2. SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)
  3. 使用Intel IPT技术保护您的帐号安全
  4. 新同事,git又报错Please move or remove them before you merge
  5. 20144306《网络对抗》Web安全基础实践
  6. 2018/04/16 PHP 设计模式之工厂模式
  7. 在Java中谈尾递归--尾递归和垃圾回收的比较
  8. 【Loadrunner】Error -26601: Decompression function 错误解决、27728报错解决方案
  9. 非极大值抑制(NMS)
  10. [原创]nginx添加module之threads