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這個與內存分配毫不相干的功能,且希望由程序員自己來解決可能引發的問題!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章