结构和联合
1.结构的声明
struct tag {member-list} variable-list;
标签声明与类型声明
struct SIMPLE
{
int a;
};
struct SIMPLE x;
typedef struct
{
int a;
} SIMPLE;
SIMPLE x;
2.结构的初始化
花括号内部,‘,’分隔:
eg:
struct init_ex
{
int a;
short b[3];
} x = {10,{1,2,3}};
3.结构的存储分配
当存储成员需要满足正确的边界对齐要求时,需要在成员之间填充额外的内存空间。可以通过调整成员的顺序减少边界对齐带来的存储损失。
eg:
struct s1
{
char a;
int b;
char c;
}
struct s2
{
int b;
char a;
char c;
}
假设机器的整形长度为4个字节,并且上面两个结构的起始位置能够被4整除,则
s1所占用的内存空间情况为: |a| | | |b |c| | | | 共12个字节
s2所占用的内存空间情况为: |b |a|c| | 共8个字节
sizeof返回的值中包括了结构中浪费的空间。
4.结构作为函数参数
考虑到效率的问题,一般使用指向结构的指针而不是结构本身作为函数参数,但是使用指针所带来的不好的一点就是使得结构的内容可能被意外修改,解决的办法是使用const关键字来防止这种修改。
5.位段
(1)为什么使用位段
它能够把长度为奇数的数据包装在一起,节省内存空间
它可以很方便的访问一个整型值的部分内容(比如寄存器各位的访问)
简化源代码。但是其实用位段实现的任务都可以用移位和掩码来实现,而且它们目标代码是相同的
(2)避免注重在可移植性的程序上使用位段
因为位段存在着很多与实现有关的依赖性,如int是被当成有符号还是无符号数,位段中位的最大数目,成员在内存中分配是从右到左还是反之等等。
(3)位段的成员
位段的成员只能是3中类型,unsigned,signed,int,其中int是signed还是unsigned由编译器决定。
6.联合
所有联合的成员都存储于同一个内存位置,联合的长度就是它最长的成员的长度。
解决联合中内存浪费的好方法是在联合中存储指向不同成员的指针,因为指针都是一样长的。
阅读(532) | 评论(0) | 转发(0) |