9

C ++でのメモリアライメント、一般的なアプローチ、コンパイラ間の違い、および一般的な落とし穴についての優れた(包括的な)ドキュメントを探しています。トピックの私の理解が正しいかどうかを確認し、何か新しいことを学ぶためだけに。

この質問は、次の構成を使用した別の質問に対する私の回答に触発されています。

char const buf[1000] = ...;
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // shift can be anything

これは、メモリアライメントルールに準拠していないと批判されました。ボーナスとして、このアプローチがメモリアライメントの観点から欠陥がある理由を説明できますか?それが機能しない場合の例は高く評価されます。一般的に悪いアプローチだとは思いますが、ネットワークプロトコルの実装でよく使用するので、理論的な質問よりも実用的な質問です。

また、厳密なエイリアシングについては言及しないでください。ここでは別の質問です。

4

3 に答える 3

6

ヒープに割り当てられcharていない配列には、配置に関する特定の要件はありません。したがって、1000文字のバッファが奇数オフセットにある可能性があります。そのオフセットからを読み取ろうとするとint(明らかにintポインターとして再解釈されます)、コンパイラーがそれを個別の読み取り+ビットマスク操作に分割しない場合、パフォーマンスが低下するか、一部のハードウェアでバスエラーが発生する可能性があります。

のヒープ割り当て配列はchar、任意のオブジェクトタイプを格納するために適切に整列されることが保証されているため、これは常にオプションです。

非ヒープベースのストレージの場合boost::aligned_storageは、一般的な使用のためにスペースが適切に配置されていることを確認するために使用します。

于 2011-09-06T13:37:56.177 に答える
3

ウィキペディアで概要を見つけることができます。IBMサイトの詳細:データの調整:まっすぐに伸ばして右に飛ぶ

于 2011-09-06T13:42:03.563 に答える
0

たとえばPS3のように、アドレスを16バイトに揃える必要がある場合を想像してみてください。そして、shift == 1であると想像してください。これは、このマシンでは機能しない、16バイトに整列されていないポインタであることは間違いありません。

于 2011-09-06T13:43:51.570 に答える