结构体的对齐访问
来源:互联网 发布:在淘宝卖假货会坐牢吗 编辑:程序博客网 时间:2024/06/06 04:58
1、结构体对齐访问实例
#include <stdio.h>struct s { char b; int c;};int main(void){ printf("sizeof(struct s) = %d.\n",sizeof(struct s)); //8 struct s s1; s1.b = 't'; s1.c = 12; char *p1 = (char*)(&s1); printf("*p1 = %c.\n",*p1); //t int *p2 = (char*)((int)&s1 + 1); printf("*p2 = %d.\n",*p2); // 201852036 int *p3 = (char*)((int)&s1 + 4); printf("*p3 = %d.\n",*p3); // 12 return 0;}
2、结构体为何要对齐访问
访问结构体元素时需要对齐访问,主要是为了配合硬件,也就是说硬件本身有物理上的限制,因此对齐排布和访问可以提高访问效率。
3、结构体对齐的规则和运算
(1)当编译器将结构体设置为4字节对齐时,结构体整体必须从4字节对齐处存放,结构体对齐后的大小必须为4的倍数。如果编译器设置为8字节对齐,则这里的4就是8。
(2)结构体中每个元素本身也必须对齐存放。
(3)编译器在考虑以上两点情况下,实现以最少内存来开辟结构体空间。
4、手动对齐
如果编译器自动实现结构体对齐,我们称之为自动对齐,与之相反,使用#pragma对齐的就是手动对齐。
我们需要以#pragma pack(n)开头,以#pragma pack()结尾,定义一个区间,这个区间内的对齐参数就是n。
#include <stdio.h>#pragma pack(4)struct mystruct1 { int a; char b; short c;};struct mystruct2 { char a; int b; short c;};typedef struct myStruct5 { int a; struct mystruct1 s1; double b; int c;}MyS5;struct stu { char sex; int length; char name[10];};#pragma pack()int main(void){ printf("sizeof(struct mystruct1) = %d.\n",sizeof(struct mystruct1)); printf("sizeof(struct mystruct2) = %d.\n",sizeof(struct mystruct2)); printf("sizeof(struct mystruct5) = %d.\n",sizeof(MyS5)); printf("sizeof(struct stu) = %d.\n",sizeof(struct stu)); /* * sizeof(struct mystruct1) = 8. * sizeof(struct mystruct2) = 12. * sizeof(struct mystruct5) = 24. * sizeof(struct stu) = 20. */ return 0;}
阅读全文
0 0
- 结构体的对齐访问
- 结构体对齐访问
- 结构体成员非对齐访问所带来的思考
- 结构体的对齐
- 30.C语言结构体对齐访问
- 结构体对齐的方式(自动对齐和手动对齐)
- 让人蛋疼的结构体对齐
- 结构体对齐的问题
- 结构体的字节对齐
- 结构体的内存对齐
- 结构体的对齐问题
- 结构体的内存对齐
- 结构体的对齐方式
- 结构体字节的对齐
- 结构体的内存对齐
- 结构体的数据对齐
- 结构体的字节对齐
- 结构体的内存对齐
- hive入门学习线路指导
- 了解枚举
- POJ 1742 Coins——不要套单调队列优化多重背包的模板
- 死锁概念
- 如何理解算法的正确性
- 结构体的对齐访问
- 智力题-猜牌问题
- 自定义的栈集合
- String
- LeetCode题目:357. Count Numbers with Unique Digits
- P1307 数字反转
- android developer tiny share-20170520
- 宋宝华的blog《Linux设备驱动开发详解》作者
- 小程序来测试加载的是哪个jar中的类