我正在使用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希望我对齐地址,我对此很好,但我至少应该知道提供什么值。我怎么能这样做?
谢谢
答案 0 :(得分:3)
看起来它正在检查自然的对齐。
因此,在32位平台上,它需要4字节对齐,而64位平台正在检查8字节对齐。
某些体系结构对于具有内存地址的数据类型未对齐非常不可原谅。