ACE_CDR::mb_align(ACE_Message_Block * mb)使用问题

ACE_CDR::mb_align(ACE_Message_Block * mb)用于对齐mb内部数据块ACE_Data_Block所拥有的内存的起始地址,它的实现大致如下:

void
ACE_CDR::mb_align (ACE_Message_Block 
* mb)
{
  char 
*   const  start  =  ACE_ptr_align_binary(mb -> base (),   ACE_CDR::MAX_ALIGNMENT);

  mb
-> rd_ptr (start);
  mb
-> wr_ptr (start);
}

由 于要执行内存地址对齐,那么mb->base()所指示的地址可能需要向后移动(MAX_ALIGMENT - mb->base() % MAX_ALIGMENT)个字节。但在这个之后,mb->base()指向的可用内存将比它自己薄记的少,如果需要程序正常运行,那么依赖于在往 它写入数据时,写入的字节数不能大于实际大小(这个实际大小为 :mb的薄记大小-移动的距离),而这需要由程序员来控制,容易出错也就难免了。

也许可以在函数mb_align内部重设mb的大小,使其薄记大小与实际有效内存大小相符,但这引起内存拷贝,这个代价也太大了。

内存对齐的处理似乎应该在内存分配阶段,比如提供类似下面的分配已对齐地址功能的分配器:

struct Align_Alloc
{
    void 
*  align_alloc(size_t size, unsigned align)
    {
        void 
*  ptr  =   new  char[size  +  align];
        return align_mb_ptr(ptr, align);
    }
};

但ACE实际上没这么做,它提供mb_align这个与内存分配毫不相干的功能,且希望由程序员自己来解决可能引发的问题!~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值