您的位置:首页 > 编程语言 > C语言/C++

C语言__结构体总结

2017-12-28 14:43 134 查看
结构体内成员对齐规则

①结构体变量本身就是在4字节对其位置,由编译器来完成。

②第一个成员,就从结构体开始的地址处存放,这个元素具体占多少个字节,由紧挨着下一个元素决定。

③整个成员变量自身都对齐了,还没有结束。

④整个结构体还要是默认字节大小的整数倍。

例typedef struct data
{
int a;
char b;
short c;
}D;
sizeof(D)=8;结构体默认的字节对齐:成员变量最大的那个类型所占的字节。
对齐指令

#pragma pack(n)  (1,2,4,8......)

#pragma pack( )

这两个配合使用,表示一个区间,只有这个区间内的结构体享受这个待遇。

设置为1,就是不对齐。

好处

①:充分利用空间,牺牲了速度,降低了访问效率。

不为1,设置对齐

好处:提高了效率,性能,牺牲了空间。

typeof()关键字,专门用于获取类型,()里可以放变量名,或者表达式。

  int *p;

变量名做参数时:typeof(p)p_a=&a; 等价于 int *p_a=&a;

表达式做参数时:typeof(*p)p_b;   等价于int p_b; 因为*p就是int类型。

结构体的宏:

    linux内核里的两个宏(在驱动中应用广泛)
1:off_set_of(type,member)用来计算结构体内元素的偏移量。
    (long)&(((type* )0)->member)
解析:(type *)0指向结构体的零地址
      ((type *)0)->member得到了结构体某个成员变量名 
      给这个成员变量名,区地址(相当于零地址),此时 &(((type *)0)->member)表示的是指针类型
  最后,强制类型转换为long
2:containe_of(ptr,type,member),ptr是结构体里成员变量的指针,通过调用这个宏得出结构体的首地址,包含两句代码,
  必须要加{}
   #define containe_of(ptr,type,member)\
({typeof(((type *)0)->member)*_mptr=ptr;\
(char *)_mptr-off_set_of(type,member);})

   解析:得到结构体成员变量的类型
             指针赋值(得到真实成员变量的地址值)
     减去偏移量得到一个数字,该数字和结构体变量成员本身地址在数值上是一样的。
     最后强制转换类型转换为结构体指针类型

位字段

   位字段专用于结构体,结构体成员的类型必须是:int 或者 unsigned int

    有时候,结构体成员表示的数据很小,就用几个位来表示。 struct data
{
unsigned a:1;//1就是一个位,范围0~1
unsigned b:2;//2就是两个位,范围0~3
}          超出位字段表示的数据范围,结果不可预期。
字段不可取地址,不能用结构体指针方式访问
无名字段,不可访问,知识占位。
32位就是4个字节,相当于一个int。
位字段的下一个字段不够在剩余的bit存放时,必须另起一个字段,字段不可以跨字。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 结构