总之结构体对齐可以总结为三个基本原则:
- 数据成员对齐规则:结构体的数据成员中,第一个成员从offset为0的地址开始,以后每一个成员存储的起始位置为该成员大小的整数倍
- 结构体作为成员: 如果一个结构体1作为另一个结构体2的数据成员,则在结构体2中结构体1要从1内部成员最大的整数倍地址开始存储。
- 结构体的总大小(sizeof): 为该结构体内部最大基本类型的整数倍,不足的要补齐,而不是简单的所有成员的大小总和。
struct str2 { double a; int b; char c; double d; };
str2这个结构体占用的内存空间是24!
分析如下:
首先double类型的a占用内存地址为0~7
int类型的b起始地址为8,符合规则一,占用地址为8~11
char类型的c占一个字节,地址为12
那么double类型的d,起始地址为13吗?显然不是,满足规则一的地址是16,所以d起始地址为16,占用16到23。
结构体总共24个字节,满足规则二。但是如果这个结构体最后再加一个成员变量 char e,那这个结构体占用的内存是多少?
分析:
char类型的e起始地址为24,占用地址为24,但是结构体一共有25个字节,就不满足规则二了,怎么办呢?
为了满足规则二,我们将25~31进行填充,因此整个结构体占用32个字节。
今天代码量900到1100行
算法特性
- 输入、输出
- 有穷性 在执行有限步骤之后,自动结束而不会出现无限循环,并且每一个步骤可在可接受的时间内完成
- 确定性 算法的每一步骤都具有确定的含义,不会出现二义性
- 可行性 算法的每一步都必须是可行的
算法设计要求
- 正确性
- 可读性
- 健壮性 当输入数据不合法是,算法也能做出相关处理,而不是产生 异常或莫名奇妙的结果
- 时间效率高和存储量低