通信协议中的地址对齐数
地址对齐数这个东西,实际上并不陌生了,在接触struct结构体的时候就遇到了,在这里也不多赘述,主要聊聊在通信协议中因为地址对齐数遇到的问题。
对于UDP/TCP通信,除了可以传递“行文本”之外,同样可以传递“字节流”。
Qt中常用的字节流就是QByteArray,通常采用的方式是:
结构体 <=> QByteArray
通常实现的是结构体和字节流的相互转化,这点不多说,我准备下一篇博客介绍一下这个转化过程,现在聊一聊转化过程中遇到的坑。
结构体因为“地址对齐数”的原因,可能会出现部分空间空着不使用的情况,如下面的结构体:
struct StTest
{
int iNum1;
char chNum;
int iNum2;
};
根据地址对齐数可以知道,这个结构体的大小为12个字节,其中char类型的在这里也是占用了4个字节,但是实际上char类型仅仅占用1个字节,这就导致了3个字节的空间是空着的,虽然空着,但也是占用着内存。
一般的通信协议的制定人员,都会考虑到这一点,使其充分利用空间,不会出现中间空的的情况。
但是,在今天,我发现我手上的一份通信协议中出现了非常智障的行为,就是没有考虑到地址对齐数(或者说他也没有其他的解决方案)导致的如果采用普通的结构体定义,会出现内存位不匹配的情况。
对于这个问题,我也是苦思冥想了好久,没找到合适的解决方案,最终通过请教同事,发现了一个非常好的解决方案:
强制定义地址对齐数为1。
采用的方式如下:
#pragram pack(1)
struct StTest
{
int iNum1;
char chNum;
int iNum2;
};
#pragram pack()
采用的方式就是使用#pragram pack(1) 和#pragram pack()对应的方式,强制将地址对齐数转化为1,这样,再使用sizeof可以发现,才是StTest的大小变为了9,这个时候就可以发现,地址对齐数不会变为4。
另外,这个的作用范围是在这两个宏定义中间,所有的结构体的地址对齐数都变为了1。
这样就解决了结构体和QByteArray之间空间不匹配的问题。
总结:
使用#pragram pack(1)和#pragram pack()对应的方式,将地址对齐数强制转化为1,可以解决因为地址对齐数变化造成的地址空出的问题。
来源:CSDN
作者:目标:全栈
链接:https://blog.csdn.net/weixin_43450564/article/details/103811689