2011-09-06 8 views
9

私は、C++でのメモリアライメント、典型的なアプローチ、コンパイラ間の違い、よくある落とし穴に関する良い(包括的な)ドキュメントを探しています。トピックの理解が正しいかどうかを確認し、新しいことを学ぶだけです。この質問は、私は構文次使用される別の質問に対する私の答えに触発され異なるプラットフォーム/コンパイラ間でのC++メモリの配置に関するドキュメントはどこにありますか?

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

これは、メモリのアライメント規則に準拠していないとして批判されました。このアプローチがメモリアライメントの観点から欠けている理由を説明してください。それが動作しない場合の例は高く評価されます。私はそれが一般的に悪いアプローチであることを知っていますが、私はネットワークプロトコルの実装でそれを使うことが多いので、理論的なものよりも実践的な質問です。

はまた、別の質問のためだ、ここでは厳しいエイリアシングを言及しないでください。 char

+0

シフトはシステムのワードサイズの倍数ではありませんか?あなたは、単語の途中でポインタを取得しようとしたことで批判されていた可能性があります(32ビットワードの途中で)、これは変です。 –

+1

シフトが4の倍数であっても、 'buf'が4の倍数のアドレスで開始するという保証はありません – nos

+0

' shift'は何でもできます質問を更新しました –

答えて

6

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

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

は、空間は、一般的使用のために適切に整列されることを保証するboost::aligned_storageを使用します。

+0

+1:残念ながら私は2つの回答を受け入れることができないので、主な質問に答えた別の回答を受け入れるべきです –

0

たとえば、PS3のように16バイトのアラインメントが必要な場合を想像してみてください。 そして、シフト== 1であると想像してください。 これは確かに、このマシンでは動作しない非16バイトのアライメントされたポインタです。

関連する問題