黑马程序员技术交流社区

标题: 结构体大小计算方法 [打印本页]

作者: xiniuniu    时间: 2014-8-16 22:38
标题: 结构体大小计算方法
本帖最后由 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字节大小作为结构体的大小。最后多出的三个字节没有使用。仅仅是用来内存对齐。所以浪费了一定内存空间。
     在编程中怎样让结构体尽可能占用较少的内存空间呢?你是不是发现了什么规律。基本数据类型占用空间较小的放在前边声明。较大的放在后边。这样占用的内存空间就会相对小很多。类数据成员内存分配规则和结构体也是一样的哦!



作者: 天蚕飞    时间: 2014-8-17 09:06
牛气:lol
作者: zhuiyi007    时间: 2014-8-17 09:29
了解了~~~
作者: qq541955920    时间: 2014-8-17 14:37
感觉好牛的样子。。。
作者: jing迪    时间: 2014-8-18 15:33
感觉好牛的样子。。。
作者: 忘了一切更好    时间: 2014-8-19 23:02
楼主威武!
作者: lovejl    时间: 2014-8-21 09:34
厉害啊~~
作者: x65396731    时间: 2014-8-21 09:38
居然还有这种情况,很牛逼!
作者: 周易    时间: 2014-8-21 09:57
好牛X:),不错!
作者: Tidom    时间: 2014-8-21 11:08
底层搞得这么牛,以前是学c的?
作者: xiniuniu    时间: 2014-8-21 13:15
Tidom 发表于 2014-8-21 11:08
底层搞得这么牛,以前是学c的?

嗯,学过C!;P




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2