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存放时,必须另起一个字段,字段不可以跨字。
①结构体变量本身就是在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语言的指针、数据、结构体关系总结
- 【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体
- C语言结构体总结
- 结构体__C语言学习内容总结2017/11/25
- C语言学习内容总结2017/11/21(结构体)
- 结构体__C语言学习内容总结2017/11/25
- C语言学习内容总结2017/11/21(结构体)
- C语言结构体课堂总结
- C语言高频面试题之sizeof与指针和结构体专题总结
- 数组结构体总结(C语言)
- 黑马程序员-c语言总结(结构体)
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
- 黑马程序员-C语言结构体总结
- 文档总结21-C语言中的结构体与内核宏
- C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结
- C语言的指针、数据、结构体关系总结
- C语言之总结篇——04——结构体
- 【C语言总结】结构体、联合、枚举
- c语言第二周总结-结构体
- C语言高频面试题之sizeof与指针和结构体专题总结