- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40150
- 在线时间
- 小时
|
发表于 2009-2-4 08:48:01
|
显示全部楼层
通常将数据分成多个结构嵌套是为了提高可读性而不是效率。
至于无心人说的过于庞大的结构可读性不好那只能说设计的太差了的结果。
比如说我们可以在结构A里面嵌套B,B里面嵌套C,C里面继续放置了D的指针。
而代码里面使用的时候通常会将A的指针或引用作为参数传递过来。而这时我们要访问里面一个存放在D里面的信息D->u,其实不需要使用
A.B.C.D->u这样的方法。
不如我们发现最近一段代码频繁访问D中的数据,我们可以定义一个函数getU(&A){return A.B.C.D->u;},然后使用函数而不是直接数据成员。这样的方法可以提高可读性。
而数据嵌套改变sizeof是显然的(通常只会变大而不会变小),这个是因为结构的尺寸都是需要数个字节对齐的。
比如我们知道数据int使用4个字节,那么现在通常计算机里面保存int类型的数据要求其地址也是4的倍数,这里的4就是数据类型int的对齐要求。而同样double类型使用8个字节,其对齐要求就是8.
产生这个要求是由于现代计算机普遍使用了缓存(cache),而每条缓存的大小都是2的幂,而每次访问内存实际上总是访问一条缓存大小的内存范围,比如32或64个字节。所以将内存存放的数据按2的幂个字节对齐,那么这样通常这些基本数据就不会跨越两条缓存了,从而提高内存访问的效率。(不然一个int可能一个字节在一条缓存上,后面3个字节在后面一条缓存上,从而读取一个int型需要访问两条缓存的数据)。于是对于数据结构
struct A{
int x;
char y,z;
};
虽然这个结构里面只有6个有效的字节,实际上通常编译器是分配了8个字节给它。而它的对齐要求是4个字节(也就是首地址要求是4的倍数)。这样如果我们分配了一个A的数字A[N],那么里面每个成员里的x的首地址也都会是4的倍数了。
当然如果我们这个结构设计的不好,写成
struct A{
char y;
int x;
char z;
};
那么这个时候,这个结构需要12个字节,对齐要求也就是4个字节,其中y在0字节,x在4~7字节,z在8字节。
而如果我们采用了嵌套的方法,比如
struct B{
int x;
char y;
};
struct A{
struct B b;
char z;
};
那么这个时候,虽然x,y,z的排列顺序还是第一种的顺序,由于结构B需要8个字节(对齐要求),所以结构A的大小也是12个字节.
其中B.x在0~3字节,B.y在4字节,z在8字节. |
评分
-
查看全部评分
|