C++ boost'中的内存对齐约束;s管理内存

C++ boost'中的内存对齐约束;s管理内存,c++,memory,boost,alignment,C++,Memory,Boost,Alignment,我正在使用boost::interprocess::managed_external_缓冲区,当尝试在特定地址创建这样的缓冲区时,我得到以下错误(断言失败): /homes/mdorier/local/include/boost/interprocess/managed\u external\u buffer.hpp:67: boost::进程间::基本\u管理的\u外部\u缓冲区::基本\u管理的\u外部\u缓冲区(boost::进程间::仅创建\u), void*,typename boos

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

/homes/mdorier/local/include/boost/interprocess/managed\u external\u buffer.hpp:67: boost::进程间::基本\u管理的\u外部\u缓冲区::基本\u管理的\u外部\u缓冲区(boost::进程间::仅创建\u), void*,typename boost::进程间::IPCDeail::基本\u管理的\u内存\u impl::大小\u类型)[与ChartType一起= char,分配算法= boost::进程间::rbtree\u best\u fit,0ul>,IndexType=boost::进程间::iset\u 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");
      }
   }
我的代码在带有GCC4.6.2的Ubuntu i686上运行良好。上面的错误出现在带有GCC4.4.3的Ubuntu x86_64上

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

如果managed_external_缓冲区希望我对齐地址,我可以接受,但我至少应该知道要提供什么值。我该怎么做


谢谢

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

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


有些体系结构非常不允许数据类型与内存地址不对齐

它看起来像是在检查自然点对齐

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


有些体系结构非常不允许数据类型与内存地址不对齐

+1。错位是可怕的。令人遗憾的是,x86体系结构没有因为没有正确对齐数据而给开发人员一记耳光。错位是可怕的。令人遗憾的是,x86体系结构没有因为没有正确对齐数据而给开发人员一记耳光。这取决于
AllocationAlgorithm::Alignment
是什么。您可以随时中断调试器并查看预期值。或者,只需几次尝试-8或16(最有可能),32或64。对于与SIMD相关的数据类型,它可能是128,但我怀疑Boost的人是否主张这样做。事实上,16起作用。非常感谢你!这取决于
AllocationAlgorithm::Alignment
是什么。您可以随时中断调试器并查看预期值。或者,只需几次尝试-8或16(最有可能),32或64。对于与SIMD相关的数据类型,它可能是128,但我怀疑Boost的人是否主张这样做。事实上,16起作用。非常感谢你!