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) [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 がアドレスを調整することを望んでいる場合は、それで問題ありませんが、少なくともどの値を提供するかを知っておく必要があります。どうやってやるの?

ありがとうございました

4

1 に答える 1

3

自然なポアントアライメントをチェックしているようです。

したがって、32ビットプラットフォームでは4バイトのアラインメントが必要ですが、64ビットプラットフォームでは8バイトのアラインメントをチェックしています。

一部のアーキテクチャでは、データ型とメモリアドレスの不整合が非常に許容されていません。

于 2012-08-22T21:23:34.163 に答える