大家应该都知道计算机中间都有字节对齐问题。CPU访问内存的时候,如果从特定的地址开始访问一般可以加快速度,比如在32位机器上,如果一个32位的整数被放在能被32模除等于0的地址上,只需要访问一次,而如果不在,可能要访问两次。但是这样就要求一些数据从特定的地址开始,而不是顺序排放(中间会有一些空余的地址),这就是字节对齐。

而ACE CDR的估计也是为了加快速度,从而在CDR编码上默认也使用了字节对齐。所以在ACE的CDR编解码过程中,传入的参数地址最好是能符合字节对齐规则,否则可能会编解码错误。

ACE_OutputCDR构造函数会调用一个函数mb_align调整传入的地址参数成为地址对齐地址。但是其的调整函数ACE_ptr_align_binary不知处于什么考虑,不是按照机器的对齐长度而是采用的 ACE_CDR::MAX_ALIGNMENT(64bit,长度为8BYTPES)作为参数地址。那么ACE_OutputCDR的内部地址是按照8字节作为对齐的,但是ACE_InputCDR却没有将内部地址调整为模除64等于0的地址上,而只是调整为模除32(在32位机器上)等于0的地址。

void

ACE_CDR::mb_align (ACE_Message_Block *mb)

{

#if !defined (ACE_CDR_IGNORE_ALIGNMENT)

//如果使用字节对齐方式,使用最大的对齐方式调整内存。调整为模除64等于0的地址上。

char * const start = ACE_ptr_align_binary (mb->base (),

ACE_CDR::MAX_ALIGNMENT);

#else

……

}

使用一段简单的代码可以测试发现这个问题。

char *tmp_buffer = new char [2048];

//使用一个无法对齐的参数作为ACE_InputCDR,ACE_OutputCDR的参数地址,

char *tmp_data = tmp_buffer +1;

// output_cdr调整了对齐的起始地址为8字节的默认

ACE_OutputCDR output_cdr(tmp_data,512);

ACE_InputCDR input_cdr(tmp_data,512);

ACE_CDR::ULong cdr_long = 123;

bool bret =false;

//

bret = output_cdr.write_ulong(cdr_long);

// cdr_long 不等于123,而是一个错误无效数据。

bret = input_cdr.read_ulong(cdr_long);

其实如果编解码的BUFF都采用相同的对齐方式,那么理论上也不应该出现问题,最多是出现为了对齐而进行填补的空隙,但是这样能带来CPU的效率提升,也是好事。但是由于ACE_OutputCDR的一个地址调整。却可能导致编解码的BUFFER不一致,我不能肯定这到底是一个错误还是作者有他自己的考虑。

这个问题到5.6.1还存在。我已经提交了问题报告。

当然有一个方法解决这个问题。就是定义宏ACE_CDR_IGNORE_ALIGNMENT【注】,只要定义了这个宏,ACE就不会使用字节对齐处理CDR编码。使用这个方法的,编码占用空间会压缩一些,但效率上可能低一点(其实未必,因为为了字节对齐还要耗费一些计算时间),

【注】ACE不知道为什么在代码中使用两个不使用字节对齐的宏,一个是在CDR_Base.h CDR_Base.cpp 文件中使用的是ACE_CDR_IGNORE_ALIGNMENT,在CDR_Stream.cpp和CDR_Stream.h文件上使用的宏ACE_LACKS_CDR_ALIGNMENT。

我一般将两个宏都定义上。

转载于:https://www.cnblogs.com/405845829qq/p/4378588.html

ACE的CDR中的字节对齐问题相关推荐

  1. 64位 int 占几个字节_面试常考,项目易错,长文详解C/C++中的字节对齐

    面试常考,项目易错,长文详解C/C++中的字节对齐​mp.weixin.qq.com 引入主题,看代码 我们先来看看以下程序 //编译器:https://tool.lu/coderunner/ //来 ...

  2. @entity 不限字节长度的类型_面试常考,项目易错,长文详解C/C++中的字节对齐...

    面试常考,项目易错,长文详解C/C++中的字节对齐​mp.weixin.qq.com 引入主题,看代码 我们先来看看以下程序 //编译器:https://tool.lu/coderunner/ //来 ...

  3. 面试常考,项目易错,长文详解C/C++中的字节对齐

    作者 | 李肖遥 来源 | 技术让梦想更伟大(ID:TechDreamer) 头图 |  CSDN 下载自东方IC 引入主题,看代码 我们先来看看以下程序 //编译器:https://tool.lu/ ...

  4. 位地址和字节地址换算_面试常考,项目易错,长文详解C/C++中的字节对齐

    (给CPP开发者加星标,提升C/C++技能) 作者:技术让梦想更伟大 / 李肖遥 (本文来自作者投稿) 我们先来看看以下程序 //编译器:https://tool.lu/coderunner///来源 ...

  5. C语言中的字节对齐以及其相关处理

    首先,我们来了解下一些基本原理: 一.什么是字节对齐 一个基本类型的变量在内存中占用n个字节,则该变量的起始地址必须能够被n整除,即: 存放起始地址 % n = 0,那么,就成该变量是字节对齐的;对于 ...

  6. 面试常考,项目易错!C/C++中的字节对齐

    作者 | 李肖遥 来源 | 技术让梦想更伟大(ID:TechDreamer) 头图 |  CSDN 下载自东方IC 引入主题,看代码 我们先来看看以下程序 //编译器:https://tool.lu/ ...

  7. 关于C++中四字节对齐的坑

    最近做一个工程,大体的意思是在程序中定义一个结构,运行中会将结构直接写到文件中,然后另一个程序会用同样的结构读出来.为了验证是写文件的程序的问题还是读文件的程序的问题,用winhex来打开文件,仿照结 ...

  8. 计算机中的字节对齐问题

    [转载]http://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: 1 typedef struct{ 2 char c1; 3 ...

  9. 怎么把位域合成一个字节_C语言中字节对齐和位域

    1.1基本类型默认字节对齐和改变字节对齐方式 c语言在给不同类型变量分配地址空间时,并不是总是紧邻着上一个变量的地址空间分配的,而是它所在的地址空间,必须被它的默认对齐字节数整除.例如,int类型占4 ...

最新文章

  1. Mysql共享锁实例_mysql共享锁与排他锁用法实例分析
  2. 地址栏射击游戏!对,你没看错,就是在地址栏上玩的游戏,有图有真相!
  3. U盘无法拷贝超过4G的大文件
  4. Spark SQL(六)之加载数据的参数配置
  5. 数据结构之并查集:UF-Tree优化并查集——19
  6. 第四天的作业与答案,py直播
  7. FD.io VPP的C语言接口如何使用:FD.io VPP: How To Use The C API
  8. 行列式(determinant)的物理意义及性质
  9. .net 初学者。学习笔记 [获取varchar32主键的最大ID值]
  10. matplotlib—patches.Circle
  11. Spring Aop 的配置与运用
  12. win2008安装mysql8.0
  13. JEP 379:将低暂停时间的垃圾收集器Shenandoah推向生产
  14. 浊音、清音、爆破音音频分析
  15. java clh_浅谈Java AQS实现——CLH锁
  16. 通达信版弘历软件指标_通达信仿弘历收费指标
  17. 浮点运算单元FPU能给电机控制带来什么?
  18. Azure Blob 文件下载及本地开发使用配置
  19. ConstrainLayout约束布局
  20. 小学计算机余数在线,【思维导图】小学数学20-有余数的除法

热门文章

  1. cocos creator2.3.5休闲游戏英文版(连连看)源码H5+安卓+IOS三端源码
  2. Tab页面知识整理及其方法分析
  3. 宝塔一键安装部署tipask登录出现错误:The email must be at least 8 characters怎么回事
  4. 事件研究法与其应用(2)---Excel实操步骤
  5. Android上的滤镜效果
  6. CSDN回帖得分大全 近两年
  7. java graphics2d旋转_反转Java Graphics2D缩放和旋转坐标
  8. .net mvc ef 视图未定义主键问题
  9. ​历经 33 天,终于拿到了心仪的 Offer
  10. 程序linux培训,马哥-51CTO-Linux培训-0910-程序包管理