2017-03-16 4 views
0

構造体のメモリアラインメントを認識していますが、私が取り組んでいるプロジェクトでこの実装に遭遇しました。構造体のメモリアラインメントを調整する

struct default { 
    uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4] // Align on 32 bit boundary 
} 

私は機能へのアクセス権を持っていけないので、それはより現時点では私のためのブラックボックステストと似ていますが、誰もがこのアライメントが起こることを引き起こすために、ここで使用さ数学を説明することができます。

+0

この構造体には32ビット境界があると思いますか? uint8_tデータ型は1バイトのアラインメントを持ちます。配列も1バイトの配列になります。サイズにかかわらず。構造体と同じです。プラットフォーム上で私はそれが1バイトのアライメントを持っていることを知っています –

答えて

1

あなたはそれを分解することができます

uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4] 

をあなたが持っている2例 - sizeof dummyStructureは4かないで均等に分割可能です。

例:

(sizeof(struct dummyStructure) = 12 
(12 + 3)/4 = 15/4 = 3 
3 * 4 = 12 

そこそこ

(sizeof(struct dummyStructure) = 16 
(16 + 3)/4 = 19/4 = 4 
4 * 4 = 16 
上記のように4

(sizeof(struct dummyStructure) = 15 
(15 + 3)/4 = 18/4 = 4 
4 * 4 = 16 

によって均等に分割可能な次のサイズを返す

(sizeof(struct dummyStructure) = 13 
(13 + 3)/4 = 16/4 = 4 
4 * 4 = 16 

元のサイズを返します

ように原稿サイズが

(sizeof(struct dummyStructure) = 17 
(17 + 3)/4 = 20/4 = 5 
5 * 4 = 20 

再び戻るので、このコードは、32ビットのアドレスに変数を整列しない現実で4

によって均等に分割可能な次のサイズを返します!ダミー構造体を手動で配置することができるように、配列内に十分な領域を割り当てます。 このソリューションは本当に悪いです。

IMHO、より良いソリューション(もちろん、コードで何が起こるかによって異なります):

1)C11

struct defaultx 
{ 
    alignas(4) int variable[sizeof(struct dummyStructure)]; 
}; 

2)のgccや打ち鳴らすので、特定の

struct defaultx 
{ 
    int variable[sizeof(struct dummyStructure)]; 
} __attribute__((aligned(4))); 

は、変数があることを確認します4バイトにアライメントされます。

+0

"このコード(OPの)は32ビットアドレスで変数を揃えていません"についての良い見解です。 – chux

1

あなたの質問への答えはdummyStructureのサイズに3を追加することによって、および4を掛けるために4で除算した結果の整数部を取ることによって、あなたが持ってするか、ということです。

  1. をdummyStructureの正確なサイズ.32ビット(または64ビットなどの倍数)に整列されている場合。
  2. または、dummyStructureのサイズよりも大きい32ビットの最初の倍数。

したがって、常に4バイトの割り切れる数(32ビットの境界線)が得られます。

例:

dummyStructureのサイズは8バイトである場合、結果は、4 = 8 *(+ 3(8)/ 4)であろう。dummyStructureのサイズは、11を言うことができますされている場合

今、結果は次のようになり((11 + 3)/ 4)* 4 = 12

開発者は、このために決めた理由私は思ったんだけど、ただし、dummyStructureは常にプロセッサのアーキテクチャに合わせて配置する必要があるためです。

関連する問題