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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiniuniu 中级黑马   /  2014-8-16 22:38  /  2283 人查看  /  10 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xiniuniu 于 2014-8-16 22:38 编辑
  1. struct test1
  2. {
  3.     char ch;
  4.     short num;
  5.     int dec;
  6. };

  7. struct test2
  8. {
  9.     short num;
  10.     int dec;
  11.     char ch;
  12.    
  13. };
复制代码

这两个结构体大小是多少呢?会一样么?为什么呢?写到程序里输出看一下结果

结构体t1的大小是8字节,而t2是12字节,整整差了4字节空间。一样的数据类型,只是摆放位置不一样。程序在运行时分配的内存大小竟然不一样。这是为什么呢?



       结构体数据在内存中分配地址主要有以下几个规则
      1首先所有数据的首地址都存放在偶数地址处。因为在计算机中从偶数地址读取数据要比从奇数地址快。
      2.用结构体成员变量的大小和编译器指定的大小进行比较。在VC++中默认是8字节对齐,XCode编译器还真不知道。也就先按8字节对齐来试验下吧
       t1.ch是一个字符占1字节空间和8比较 1小,那么就在1的整数倍地址处存储, 所以t1.ch存储在0x7fff5fbff8a8处。
       t1.num是一个short类型占2字节空间,和8比较,2 小,那么就在2的整数倍地址处存储, 所以t1.num就存储在0x7fff5fbff8aa处。
       t1.dec是一个int类型占4字节空间, 和8比较 4小, 那么就在4的整数倍地址处存储,所以t1.dec就存储在0x7fff5ff8c处
     3 每个成员变量按照上边的规则分配完地址后,找到成员中基本数据类型最大那个类型, 在test1中int类型最大,int类型占4字节空间。4和8比较,4小,所以 最后结构体的大小就是4 的倍数。由这三个成员变量组成的内存大小是8字节,而8字节正好是4的倍数。所以最后结构体t1的大小为8字节

     同样,test2按照上边的规则分配完地址后。test中最大的基本数据类型也是int占4字节空间,4和8比,4小。所以结构体整体大小是4的倍数。
     由这三个变量占用内存大小为9个字节。那么就只好取12字节大小作为结构体的大小。最后多出的三个字节没有使用。仅仅是用来内存对齐。所以浪费了一定内存空间。
     在编程中怎样让结构体尽可能占用较少的内存空间呢?你是不是发现了什么规律。基本数据类型占用空间较小的放在前边声明。较大的放在后边。这样占用的内存空间就会相对小很多。类数据成员内存分配规则和结构体也是一样的哦!


10 个回复

倒序浏览
牛气:lol
回复 使用道具 举报
了解了~~~
回复 使用道具 举报
感觉好牛的样子。。。
回复 使用道具 举报
感觉好牛的样子。。。
回复 使用道具 举报
楼主威武!
回复 使用道具 举报
lovejl 初级黑马 2014-8-21 09:34:51
7#
厉害啊~~
回复 使用道具 举报
居然还有这种情况,很牛逼!
回复 使用道具 举报
周易 中级黑马 2014-8-21 09:57:47
9#
好牛X:),不错!
回复 使用道具 举报
Tidom 来自手机 初级黑马 2014-8-21 11:08:15
10#
底层搞得这么牛,以前是学c的?
回复 使用道具 举报
Tidom 发表于 2014-8-21 11:08
底层搞得这么牛,以前是学c的?

嗯,学过C!;P
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马