C++11 のパフォーマンスにとってアラインメントは本当に重要ですか? 質問する

C++11 のパフォーマンスにとってアラインメントは本当に重要ですか? 質問する

C++11 では、アライメントはパフォーマンスにとって本当に重要ですか?

Stroustrup の本には、構造体のメンバーを最大から最小の順に並べるというアドバイスがあります。しかし、実際にこれによって違いが出るかどうか、またコードを書くときにそれについて考える価値があるかどうかを測定して確認した人はいるのだろうかと思います。

ベストアンサー1

アラインメントはパフォーマンスだけでなく、正確性にも影響します。一部のアーキテクチャでは、データが正しくアラインメントされていない場合、または間違ったメモリ位置にアクセスした場合にプロセッサ トラップで失敗します。他のアーキテクチャでは、アラインメントされていない変数へのアクセスが複数のアクセスとビットシフトに分割され (多くの場合はハードウェア内部で、場合によっては OS トラップ ハンドラーによって)、アトミック性が失われます。

メンバーをサイズの降順で並べ替えるというアドバイスは、配置や速度のためではなく、最適なパッキングとパディングによる無駄なスペースの最小化のためです。特殊なプラグマ (つまり、非移植性#pragma pack) またはキーワードを使用して非準拠レイアウトを要求しない限り、メンバーはどのような順序でリストされても正しく配置されます。構造体の合計サイズはパディングの影響を受け、速度にも影響しますが、最適な別の順序が存在することがよくあります。

最高のパフォーマンスを得るには、一緒に使用されるメンバーを同じキャッシュ ラインに配置し、異なるスレッドによってアクセスされるメンバーを異なるキャッシュ ラインに配置するようにしてください。場合によっては、スレッド間で共有される変数を独自のキャッシュ ラインに配置するために大量のパディングが必要になることがあります。しかし、これは偽の共有によってパフォーマンスが低下するよりはましです。

おすすめ記事