字节对齐的几个问题
来源:互联网 发布:linux cp 所有文件 编辑:程序博客网 时间:2024/06/04 19:06
相信大家或多或少都会遇到字节对齐的情况,然而在不明就里的情况下,忽视字节对齐,就会导致数据乱作一团,而不得其解。
这样的问题同样困扰过我,是在跨平台数据交换的时候遇到的。当然,同时还可能会有大小端(Big_Endian and Little_Endian)问题,在此且不谈及。
通过查阅资料,才算略知其一。
默认的字节对齐不一定适用于我们的应用环境,在这样的情景之下,我们需要显示指定字节对齐方式。方法就是预编译指令
“#pragma pack(n)”
需要注意的是这条预编译指令的使用方式,类似于锁的使用,需要成对使用。 在处理完显示指定字节对齐后就要恢复为默认的字节对齐方式,其指令也是#pragma pack()
例如: 以2字节对齐为例
#pragma pack(push)
#pragma pack(2)
#pragma pack(pop)
或者,更简洁一些
#pragma pack(2)
#pragma pack()
另一个相关的问题时,在考虑字节对齐时的类型大小
CASE 1:
#pragma pack(2)
struct A
{
char c; // offsetof(A, c) = 0
double d; // offsetof(A, d) = 2
short s; // offsetof(A, s) = 10
};
#pragma pack()
cout << sizeof(A) << endl; //12
CASE 2:
CASE 1:
#pragma pack(16)
struct A
{
char c; // offsetof(A, c) = 0
double d; // offsetof(A, d) = 8
short s; // offsetof(A, s) = 16
};
#pragma pack()
cout << sizeof(A) << endl; //24
结论:
#pragma pack(n)来设定变量以n字节对齐,就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数; 否则必须为n的倍数。
- 字节对齐的几个问题
- 字节对齐的探讨
- 字节对齐的问题
- 字节对齐的探讨
- 字节对齐的作用
- 字节对齐的问题
- 字节对齐的处理
- 通俗易懂的字节对齐
- 字节对齐的问题
- 字节对齐的问题
- 字节对齐的规则
- 字节对齐的作用
- 字节的对齐方式
- 字节对齐的讲解
- 字节对齐的计算
- 字节对齐的算法
- 字节的对齐原理
- C++的字节对齐
- 前端框架样式
- 守护进程(Daemon)
- 41、和为S的连续正数序列
- Linux文件系统之proc文件系统
- leetcode 392. Is Subsequence
- 字节对齐的几个问题
- 常用设计模式及例子(五)
- CC2630选择内部32KHZ时钟
- Tomcat源码分析之三_ 可携带状态的线程池
- 注解 Annotation
- CANopen预定义连接集
- Myeclipse中创建Maven工程的时候没有 webapp-javaee6
- 各种工具使用学习说明(vs,qt,eclipse,clion)
- win10最简单定时关机命令