boost的管理内存中的内存对齐限制

时间:2012-08-22 21:17:40

标签: c++ memory boost alignment

我正在使用boost :: interprocess :: managed_external_buffer,当尝试在特定地址创建这样的缓冲区时,我收到以下错误(断言失败):

  

/homes/mdorier/local/include/boost/interprocess/managed_external_buffer.hpp:67:   提高::进程间:: basic_managed_external_buffer :: basic_managed_external_buffer(升压::进程间:: create_only_t,   void *,typename   boost :: interprocess :: ipcdetail :: basic_managed_memory_impl :: size_type)[with CharType =   char,AllocationAlgorithm =   boost :: interprocess :: rbtree_best_fit,0ul>,IndexType = boost :: interprocess :: iset_index]:断言`(0   ==(((std :: size_t)addr)&(AllocationAlgorithm :: Alignment - size_type(1u))))'失败。

managed_external_buffer.hpp中的第67行对应于以下函数中的BOOST_ASSERT语句:

//!Creates and places the segment manager. This can throw
   basic_managed_external_buffer
      (create_only_t, void *addr, size_type size)
   {
      //Check if alignment is correct
      BOOST_ASSERT((0 == (((std::size_t)addr) & (AllocationAlgorithm::Alignment - size_type(1u)))));
      if(!base_t::create_impl(addr, size)){
         throw interprocess_exception("Could not initialize buffer in basic_managed_external_buffer constructor");
      }
   }

我的代码在使用GCC 4.6.2的Ubuntu i686上运行良好。上面的错误出现在带有GCC 4.4.3的Ubuntu x86_64上。

任何想法为什么在一个平台上我没有得到任何错误,而内存对齐似乎在另一个平台上很重要?

如果managed_external_buffer希望我对齐地址,我对此很好,但我至少应该知道提供什么值。我怎么能这样做?

谢谢

1 个答案:

答案 0 :(得分:3)

看起来它正在检查自然的对齐。

因此,在32位平台上,它需要4字节对齐,而64位平台正在检查8字节对齐。

某些体系结构对于具有内存地址的数据类型未对齐非常不可原谅。