boost::interprocess
を介して共有メモリの静的チャンクを作成するときに、どれだけのメモリを割り当てる必要があるかについて、決定的な答え(実際に存在する場合)を探していますmanaged_shared_memory
。公式の例でさえ、任意に大きなメモリのチャンクを割り当てているようです。
次の構造を検討してください。
// Example: simple struct with two 4-byte fields
struct Point2D {
int x, y;
};
私の最初の反応は、必要なサイズは 8 バイト、つまりsizeof(Point2D)
. オブジェクトを構築しようとすると、これは惨めに失敗し、実行時にセグメンテーション違反が発生します。
// BAD: 8 bytes is nowhere near enough memory allocated.
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D));
seg-fault の原因となっている読み取り/書き込み操作は何ですか? スタック操作?segment.construct()
?内の一時的な割り当て 共有メモリを割り当てる際に必要なオーバーヘッドはどれくらいですか?
試行錯誤の結果、上記の構造ではサイズを 4 倍にするとうまくいくことがわかりましたが、 にフィールドを追加し始めるとうまくいきませんstruct
。だから、それは悪いハックのにおいがします。
現代の PC では「メモリは安い」と主張する人もいるかもしれませんが、私はこの考え方に同意せず、必要以上に割り当てることを避けることができれば嫌いです。昨日、Boost のドキュメントを調べてみましたが、推奨事項が見つかりませんでした。今日は何か新しいことを学びましょう!