通信协议中的地址对齐数问题

杀马特。学长 韩版系。学妹 提交于 2020-01-04 02:43:32

通信协议中的地址对齐数

地址对齐数这个东西,实际上并不陌生了,在接触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,可以解决因为地址对齐数变化造成的地址空出的问题。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!