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

通信协议中的地址对齐数

地址对齐数这个东西,实际上并不陌生了,在接触struct结构体的时候就遇到了,在这里也不多赘述,主要聊聊在通信协议中因为地址对齐数遇到的问题。

对于UDP/TCP通信,除了可以传递“行文本”之外,同样可以传递“字节流”。
Qt中常用的字节流就是QByteArray,通常采用的方式是:
结构体 <=> QByteArray
通常实现的是结构体和字节流的相互转化,这点不多说,我准备下一篇博客介绍一下这个转化过程,现在聊一聊转化过程中遇到的坑。

结构体因为“地址对齐数”的原因,可能会出现部分空间空着不使用的情况,如下面的结构体:

struct StTest
{
	int iNum1;
	char chNum;
	int iNum2;
};

根据地址对齐数可以知道,这个结构体的大小为12个字节,其中char类型的在这里也是占用了4个字节,但是实际上char类型仅仅占用1个字节,这就导致了3个字节的空间是空着的,虽然空着,但也是占用着内存。

一般的通信协议的制定人员,都会考虑到这一点,使其充分利用空间,不会出现中间空的的情况。
但是,在今天,我发现我手上的一份通信协议中出现了非常智障的行为,就是没有考虑到地址对齐数(或者说他也没有其他的解决方案)导致的如果采用普通的结构体定义,会出现内存位不匹配的情况。

对于这个问题,我也是苦思冥想了好久,没找到合适的解决方案,最终通过请教同事,发现了一个非常好的解决方案:
强制定义地址对齐数为1。
采用的方式如下:

#pragma pack(1)
struct StTest
{
	int iNum1;
	char chNum;
	int iNum2;
};
#pragma pack()

采用的方式就是使用#pragma pack(1) 和#pragma pack()对应的方式,强制将地址对齐数转化为1,这样,再使用sizeof可以发现,才是StTest的大小变为了9,这个时候就可以发现,地址对齐数不会变为4。
另外,这个的作用范围是在这两个宏定义中间,所有的结构体的地址对齐数都变为了1。
这样就解决了结构体和QByteArray之间空间不匹配的问题。

总结:

使用#pragma pack(1)和#pragma pack()对应的方式,将地址对齐数强制转化为1,可以解决因为地址对齐数变化造成的地址空出的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值