本帖最后由 xiniuniu 于 2014-8-16 22:38 编辑
- struct test1
- {
- char ch;
- short num;
- int dec;
- };
- struct test2
- {
- short num;
- int dec;
- char ch;
-
- };
复制代码
这两个结构体大小是多少呢?会一样么?为什么呢?写到程序里输出看一下结果
结构体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字节大小作为结构体的大小。最后多出的三个字节没有使用。仅仅是用来内存对齐。所以浪费了一定内存空间。
在编程中怎样让结构体尽可能占用较少的内存空间呢?你是不是发现了什么规律。基本数据类型占用空间较小的放在前边声明。较大的放在后边。这样占用的内存空间就会相对小很多。类数据成员内存分配规则和结构体也是一样的哦!
|