を考えてみましょう:保護されたメンバー変数の間違った共有?
class Vector
{
double x, y, z;
// …
};
class Object
{
Vector Vec1, Vec2;
std::mutex Mtx1, Mtx2;
void ModifyVec1() { std::lock_guard Lock(Mtx1); /* … */ }
void ModifyVec2() { std::lock_guard Lock(Mtx2); /* … */ }
};
をミューテックスや警備変数が連続して格納され、キャッシュされたとき、彼らはキャッシュラインを共有するいずれかの場合、これは「クロスロック」の一種を引き起こす可能性がありますか?
もしそうなら、それらが保護する変数の直後(またはその前)にmutexを宣言することはよい習慣ですか?
クラスをstd::hardware_destructive_interference_size
(P0154)に設定すると、この影響を避けることができます。オブジェクトのオーバーアライメントに潜在的なメリットはありますか?
C++標準では、クラスメンバーを特定の順序でレイアウトする必要はありません(ここでは適用できない警告があります)。コンパイラのドキュメントから、クラスメンバーに対して決定的な順序を使用するかどうかを判断できます(可能性が高い)。 –
@SamVarshavchik標準レイアウトのクラスでは、宣言の順番でなければならず、今までに投稿された内容に基づいて、これが標準のレイアウトクラスになる可能性があります。また、OPが特定の実装の詳細について質問しているので、それは本当に重要ではありません。 –
@ Rakete1111自由に編集してください。 – metalfox