0

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

/homes/mdorier/local/include/boost/interprocess/managed_external_buffer.hpp:67: boost::interprocess::basic_managed_external_buffer::basic_managed_external_buffer(boost::interprocess::create_only_t, void*, typename boost::interprocess::ipcdetail: :basic_managed_memory_impl::size_type) [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 要我对齐地址,我可以接受,但我至少应该知道要提供什么值。我怎样才能做到这一点?

谢谢

4

1 回答 1

3

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

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

一些体系结构非常难以容忍数据类型与内存地址的错位。

于 2012-08-22T21:23:34.163 回答