メモリ マップド ファイル内に割り当てられたブースト multi_index_container に頼ることはできますか? この種の「データベース」は、同じエンディアンを持つコンピューター間で移植できますか?
3 に答える
いいえ、これは安全ではありません。メモリ マップド ファイルの最初のバイトのアドレスが、呼び出し間で同じであることは保証できません。
Boost のメモリ マップド ファイルには がかかりますが、hint
これはヒントにすぎません。
したがって、最初の呼び出しでは、メモリは にある可能性があります0xBAADF00D
。2 回目の呼び出しでは、 にある可能性があります0xF00DBAAD
。0xBAADF00D
構造内のポインタは、 aroundではなく around のメモリを指すため、有効ではなくなります0xF00DBAAD
。
重大な問題として、通常はテストで機能するhint
可能性があります。通常は に従いますが、そのメモリ アドレスには既にデータが存在する場合があり、hint
無視する必要があります。
(これを非常に難しくしている部分は他にもありますが、上記はかなり実行不可能です)。
現在、このような戦略は機能しますが、問題のデータ構造の非常に侵入的なイントロスペクションが必要です。データ構造に正しいオフセットを持たせるために、DLL の再アドレス指定のようなパスを実行する必要があり、その時点までにフラットにシリアル化することもできます。
あるコンピューターから別のコンピューターにデータを転送することが必要な場合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);