C++ Space

C++, 3DGame

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这个与内存分配毫不相干的功能,且希望由程序员自己来解决可能引发的问题!~
 

posted on 2007-03-09 15:33 Kooyu 阅读(1577) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理