2

メモリ マップド ファイル内に割り当てられたブースト multi_index_container に頼ることはできますか? この種の「データベース」は、同じエンディアンを持つコンピューター間で移植できますか?

4

3 に答える 3

2

いいえ、これは安全ではありません。メモリ マップド ファイルの最初のバイトのアドレスが、呼び出し間で同じであることは保証できません。

Boost のメモリ マップド ファイルには がかかりますが、hintこれはヒントにすぎません。

したがって、最初の呼び出しでは、メモリは にある可能性があります0xBAADF00D。2 回目の呼び出しでは、 にある可能性があります0xF00DBAAD0xBAADF00D構造内のポインタは、 aroundではなく around のメモリを指すため、有効ではなくなります0xF00DBAAD

重大な問題として、通常はテストで機能するhint可能性があります。通常は に従いますが、そのメモリ アドレスには既にデータが存在する場合があり、hint無視する必要があります。

(これを非常に難しくしている部分は他にもありますが、上記はかなり実行不可能です)。

現在、このような戦略は機能しますが、問題のデータ構造の非常に侵入的なイントロスペクションが必要です。データ構造に正しいオフセットを持たせるために、DLL の再アドレス指定のようなパスを実行する必要があり、その時点までにフラットにシリアル化することもできます。

于 2013-01-04T19:44:08.457 に答える
0

あるコンピューターから別のコンピューターにデータを転送することが必要な場合multi_indexは、そのまま使用できる Boost.Serialization を使用するのが最善の方法です。

http://www.boost.org/doc/libs/1_60_0/libs/multi_index/doc/tutorial/creation.html#serialization

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <fstream>
...
void save(const employee_set& es)
{
  std::ofstream ofs("data");
  boost::archive::text_oarchive oa(ofs);
  oa<<es;
}

void load(employee_set& es)
{
  std::ifstream ifs("data");
  boost::archive::text_iarchive ia(ifs);
  ia>>es;
}
...
employee_set es; // a multi_index type
... // fill it with data
save(es);
...
employee_set restored_es;
load(restored_es);
于 2016-06-01T21:20:59.320 に答える