在网络协议、通信控制、嵌入式系统、驱动开发等地方,我们经常要传送的不是简单
的字节流(char 型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 经验不足的开发人员往往将所有需要传送的内容依顺序保存在char 型_______数组中,通过指针偏
移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议 有所变化,程序就要进行非常细致的修改,非常容易出错。这个时候只需要一个结构体就 能搞定。平时我们要求函数的参数尽量不多于4 个,如果函数的参数多于4 个使用起来非 常容易出错(包括每个参数的意义和顺序都容易弄错),效率也会降低(与具体CPU 有关,ARM
芯片对于超过4 个参数的处理就有讲究,具体请参考相关资料)。这个时候,可以用结构体 压缩参数个数。
空结构体多大?
结构体所占的内存大小是其成员所占内存之和(关于结构体的内存对齐,请参考预处 理那章)。这点很容易理解,但是下面的这种情况呢? struct student { }stu;
sizeof(stu)的值是多少呢?在Visual C++ 6.0 上测试一下。
很遗憾,不是0,而是1。为什么呢?你想想,如果我们把struct student 看成一个模子
的话,你能造出一个没有任何容积的模子吗?显然不行。编译器也是如此认为。编译器认 为任何一种数据类型都有其大小,用它来定义一个变量能够分配确定大小的空间。既然如 此,编译器就理所当然的认为任何一个结构体都是有大小的,哪怕这个结构体为空。那万 一结构体真的为空,它的大小为什么值比较合适呢?假设结构体内只有一个char 型的数据 成员,那其大小为1byte(这里先不考虑内存对齐的情况).也就是说非空结构体类型数据最 少需要占一个字节的空间,而空结构体类型数据总不能比最小的非空结构体类型数据所占 的空间大吧。这就麻烦了,空结构体的大小既不能为0,也不能大于1,怎么办?定义为0.5个byte?但是内存地址的最小单位是1 个byte,0.5 个byte 怎么处理?解决这个问题的最好 办法就是折中,编译器理所当然的认为你构造一个结构体数据类型是用来打包一些数据成 员的,而最小的数据成员需要1 个byte,编译器为每个结构体类型数据至少预留1 个byte 的空间。所以,空结构体的大小就定位1 个byte。