解析C语言结构体,位段

来源:互联网 发布:淘宝床上用品床罩 编辑:程序博客网 时间:2024/05/18 20:10

1.结构体的定义

将不同类型的数据组合成一个有机的整体,这些整合在一个整体中的数据是互相联系的,它们组织成一个组合项,在一个组合项中包含若干个类型不同(也可以相同)的数据项,C语言 中允许用户自己指定这样一种数据类型,它称为结构体。

2.结构的初始化

结构的初始化与数组的初始化很相似。一个位于一对花括号内部、由逗号分隔的初始值列表可用于结构各个成员的初始化。这些值根据结构成员列表的顺序写出。如果初始列表的值不够,剩余的结构成员将使用缺省值进行初始化。例:


3.结构体的typedef

使用关键字typedef可以对结构体类型声明一个新的名字,例:


4.结构体的内存存储


下面来解释为何是24,首先来了解内存对齐规则:

(1)结构的第一个成员永远都放在0偏移处;

(2)从第二个成员开始,都要对齐到对齐数的整数倍处;

对其数:结构成员自身大小和编译器默认对齐数的较小值;

默认对齐数:vs-8,linux-4;

(3)结构体的总大小必须是最大对齐数的整数倍;

(4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍

存在内存对齐的原因:

(1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

(2)性能原因:数据结构(尤其是栈)应该尽可能地在自认边界上对齐。原因在于:为了访问未对齐的内存,处理器需要做两次内存访问,而对齐的内存访问仅需要一次访问。

5.位段

位段成员必须声明为int,signed int或unsigned int,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位的个数。例:


存储方式为:第二个位段无法放在第一个位段剩余的位上时,编译器会把第二个位段放在内存的下一个字节上,在VC 中位段存储单元的大小是4字节。位段不能跨平台使用。



原创粉丝点击