メモリアライメント
1、CPUのアクセス原則
CPUは、データのバイトにアクセスしていません。CPU ブロックサイズのピースとしてメモリにあってもよい2 、4 、8 、16 に、サイズのバイトのCPU 時間、メモリは、リードの一つです。各メモリアクセスは、固定費を持ってパフォーマンスを向上させるメモリアクセスの数を減らすことができます。そのため、CPUは、典型的には2/4/8/16/32 バイトアクセス動作ユニット。我々は、これらのアクセスユニットがブロックサイズ(と呼ばれる呼び出すメモリアクセス粒度&)メモリアクセス粒度。
たとえば、次のいずれかのアクセス粒度に4 バイトのメモリ開始アドレス0が読み出される4 レジスタにバイト、アドレス1が読み出される4 レジスタにバイト。
ときからアドレス0 のリードデータの開始時には、読み出しデータが1で直接行うことができます読んで、アドレスを揃えています。ときからのアドレスデータを読み込む際に、データの非整列アドレスをリード。完全に2倍のデータを読む必要があります。
そして、データの後に二回読まれましたが、また、0-3 のデータが上方にシフトされた1 バイトを、4-7 のデータがで下方にシフトされた3 バイト。次に、2つの最後のデータレジスタに組み合わせます。
多くの余分な作業なので、非整列データのメモリCPU 大幅に減少し、大きなオーバーヘッド、CPUのパフォーマンスを。そのため、いくつかのプロセッサはあなたのために仕事をすることに消極的でした。
メモリアライメントの原則
1:データメンバアライメントルール:データメンバの構造(構造体)(または組み合わせて(連合))、第一
ストアへのオフセットは0でローカルデータメンバ、各データメンバの後に開始位置
部材又は大きさのメンバーの子メンバーのサイズから(メンバーは、配列など子メンバーを有する限り、
このような4バイトのintとして複数の構造、等)(整数開始、スタートアドレスメモリ4からの整数倍であります
リザーブ。
2:メンバーとして構造:構造場合、構造体の一部のメンバーは、構造部材から、あります
開始アドレスの整数倍の内部要素の最大サイズが格納される。(構造体A場合が構造体B、B
チャー、int型、ダブル、Bが格納されている8の整数倍から開始すべきであることを他の要素があります。)
3:最後の仕上げ:結果sizeofはある構造体の合計サイズが、その内部の最大でなければなりません
複数のメンバー整数。不十分な充填されます。
例:
1 、
構造体 StructTwo {
ダブル B; // 8つの。バイト
文字 A; // 1つのバイト
ショート D; // 2 -byte + 1
int型 C; // 4つのバイト
} MyStruct3。
B(8)は8以上、最大8を充填されています。D(2)、続いて(1)、開始位置で開始するために、任意の後必要で、3まで追加して4の2の倍数です。C(4)と一緒に、D列になります。
B(8)+ [(1)+ D(2)+ 1 + C(4)] = 16。
2 、
構造体 StructTwo {
ダブル B; // 8つの。バイト
文字 A; // 1つのバイト
int型の C; // 4。バイト+3
短い D; // 2 バイト+ 6
} MyStruct2。
MyStruct2
B(8)、最大8、8未満で満たしました。C(4)が続く(1)は、任意に4つの完全な複数の開始時、すなわちを開始する必要の後ろ5,8に加算します。したがって、D(2)図6はそれらを再度満たしました。
B(8)+ [(1)+ C(4)+3] + D(2)= 24 +6。
3 、
構造体 StructTwo {
文字 A; // 1つのバイト
構造体 MyStruct2; // 24のバイト 8-31
int型の C; // 4。バイト 32-35
短い D; // 2 バイト+ 2 36-37
} MyStruct3。
MyStruct3
MyStruct2 に少ない充填8より、B(8)、最大8。(1)(1)の背後にある構造自体は7を満たしました。MyStruct2の構造がある24 。C(4)+ D(2 )= 6 2を再び満たしました。
[(1)+7] + 24 + [C(4)+ D(2)+2] = 40。
4 、
構造体 StructTwo {
int型 C; // 4つのバイト
} MyStruct4。
構造体 StructTwo {
文字 A; // 1つのバイト
構造体 MyStruct4; // 4。バイト 8-31
int型の C; // 4。バイト 32-35
短い D; // 2 バイト+ 2 36-37
} MyStruct5。
MyStruct5
MyStruct4 における C(4)、最大4は4未満、充填されています。4の整数倍で嘘を満たしながら。A(1)及び7バイトがあるMyStruct4 から4 自体はあるが、バイト列4 バイト(1)。8 = +3+ MyStruct4 。C(4)+ D(2 )= 6 2を再び満たしました。
[(1)+ 3 + 4] + [C(4)+ D(2)+2] = 16。