2017-08-16 22 views
0

属性((整列(X))ディレクティブを使用している場合ので、私は面白いコンパイラの動作を見ている。(私はGCCを使用しています)副作用)

次のような構造を考慮し

typedef struct 
{ 
    char buffer[4096] __attribute__((aligned(4096)); 
    int y; 
} s1; 

構造のサイズが4100バイトで、私は構造が実際に4Kのアドレスではなく、追加の2不要な側に整列される参照生成.MAPファイルを見たときに4K整列アドレス、 でなければなりませんエフェクト:

  1. 私の整列した構造の前にある変数の間にはパディングがあります。スペースを浪費しているので、このスペースを他の変数で埋めるようにするにはどうすればいいですか?

  2. 構造アドレスは整列されるだけでなく、整列されたサイズになりました。つまり、4Kに整列されたオフセットで開始された後の変数です(4100バイト構造の場合8Kが割り当てられます)。

私の質問:どのように私は、その整列アドレスへの構造の大きさを揃えるために試してみて、そこに詰め物や場所の変数を最適化する(例えば、変数がそれに続く)とどのように私は、コンパイラを防ぐないようにコンパイラを作るのですか?

0x00012524  variable1 
0x00012534  [padding] 
0x00013000  my_struct (0x4100 bytes but consumes 8192) 
0x00015000  variable3 

おかげ ヴィート

+0

あなたは、整列させてから、しないようにしました。 –

+0

末尾のパディングについては何もできません。これは、整列したオブジェクトで期待されます。あなたが望むことができる最高のことは、 'variable3'が' struct'の前に置かれていることです。おそらくサイズを最適化するオプション( '-Os'のような)が役に立ちます。 –

+0

1)整列された拡張とは何の関係もありません。構造体は偶数アドレスに割り当てなければなりません。 – Lundin

答えて

0

私は他の方法が表示されていないが、あなたのリンカスクリプトで追加のセグメントを宣言すると、そこに変数を配置します。このセグメントを.bssと.dataセグメントよりも先に置いてください。完了しました。