大家应该都知道计算机中间都有字节对齐问题。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。

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

ACE的CDR中的字节对齐问题的更多相关文章

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

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

  2. C++中的字节对齐分析

    struct A { int a; char b; short c; }; struct B { char a; int b; short c; }; #pragma pack(2) struct C ...

  3. C++中的字节对齐

    本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! 字节对齐 1. 基本概念字节对齐:计算机存 ...

  4. C语言中的字节对齐

    下面这个篇博客讲解很好 http://blog.csdn.net/meegomeego/article/details/9393783 总的来看分三类: 1. 不加 #pragma pack(n)伪指 ...

  5. 关于sizeof与#pragma pack 以及网络上关于字节对齐的一点感想

    工作中面试中对于字节对齐基本上是必考一个知识点,而很多面试是网络上上原题.基本上背一背就可以写正确,而关于4字节对齐我相信很多人也只是一个基本地了解,对于一些题目就感觉有问题,而且很多blog后面仍然 ...

  6. c++内存中字节对齐问题详解

    一.什么是字节对齐,为什么要对齐?    现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址 ...

  7. 关于C语言中结构体中的结构体成员导致的字节对齐问题

    关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...

  8. stm32中字节对齐问题(__align(n),__packed用法)

    ARM下的对齐处理   from DUI0067D_ADS1_2_CompLib 3.13 type  qulifiers 有部分摘自ARM编译器文档对齐部分  对齐的使用:  1.__align(n ...

  9. stm32中使用#pragma pack(非常有用的字节对齐用法说明)

    #pragma pack(4)   //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐 typedef struct { char buf[3];//bu ...

随机推荐

  1. hdu A strange lift

    有起点和终点,有方向,有最少次数,所以这道题很明显是一道bfs的题目,这题要利用vist数组来标记已走过的楼层,因为这题里面已走过的楼层是不可能在走第二遍的. 第二次走和第一次走的选择没有任何的区别. ...

  2. 创建自定义 jQuery 移动主题

    自定义页面.工具栏.内容.表单元素.列表.按钮等元素的外观 智能电话和平板设备的高采用率最终导致增加了对移动 Web 开发人员和设计师的需求.jQuery Mobile 框架支持您创建能与原生应用程序 ...

  3. Wps 方框里面加勾

    1.选择插入-->选择符号 2.选择更多 3.选择 字体Wingdings 然后下拉到最后.就看到了

  4. Apache Spark源码走读之19 -- standalone cluster模式下资源的申请与释放

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文主要讲述在standalone cluster部署模式下,Spark Application在整个运行期间,资源(主要是cpu core和内存)的申请与 ...

  5. 从个人的角度谈谈本次GNTC大会的收获

    GNTC资料:from sdnlab 从个人的角度谈谈本次大会的收获 从本次大会的主题演讲来看,目前SDN.NFV的最前沿已经不再像五年前持观望态度以及探讨,各大运营商.各大厂商已经将SDN.NFV具 ...

  6. Ecshop、Discuz! 等开源产品的局限

    Ecshop.Discuz! 等开源产品的局限 记得今年年初,我初次接触Discuz!和Ecshop时,一阵阵地惊叹:成熟度这么高的产品,居然是免费的.我们这些搞传统软件开发的要怎么活?另外也奇怪,做 ...

  7. Windows与Linux/Mac系统时间不一致的解决方法

    Windows与Linux/Mac系统时间不一致的解决方法 分类: linux2012-02-12 14:25 1691人阅读 评论(1) 收藏 举报 windowsubuntusystemlinux ...

  8. 【Xamarin笔记】Events, Protocols and Delegates

    Events, Protocols and Delegates   事件.协议和委托 This article presents the key iOS technologies used to re ...

  9. 蓝牙的AVDTP协议笔记

    1.概述    AVDTP(AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL)是用来描述音频/视频在蓝牙设备间的传输的协议,是A2DP协议的基础协议,其在协议栈中 ...

  10. Android源码剖析之Framework层基础版(窗口、linux、token、Binder)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...