属性((整列(X))ディレクティブを使用している場合ので、私は面白いコンパイラの動作を見ている。(私はGCCを使用しています)副作用)
次のような構造を考慮し
typedef struct
{
char buffer[4096] __attribute__((aligned(4096));
int y;
} s1;
構造のサイズが4100バイトで、私は構造が実際に4Kのアドレスではなく、追加の2不要な側に整列される参照生成.MAPファイルを見たときに4K整列アドレス、 でなければなりませんエフェクト:
私の整列した構造の前にある変数の間にはパディングがあります。スペースを浪費しているので、このスペースを他の変数で埋めるようにするにはどうすればいいですか?
構造アドレスは整列されるだけでなく、整列されたサイズになりました。つまり、4Kに整列されたオフセットで開始された後の変数です(4100バイト構造の場合8Kが割り当てられます)。
私の質問:どのように私は、その整列アドレスへの構造の大きさを揃えるために試してみて、そこに詰め物や場所の変数を最適化する(例えば、変数がそれに続く)とどのように私は、コンパイラを防ぐないようにコンパイラを作るのですか?
0x00012524 variable1
0x00012534 [padding]
0x00013000 my_struct (0x4100 bytes but consumes 8192)
0x00015000 variable3
おかげ ヴィート
あなたは、整列させてから、しないようにしました。 –
末尾のパディングについては何もできません。これは、整列したオブジェクトで期待されます。あなたが望むことができる最高のことは、 'variable3'が' struct'の前に置かれていることです。おそらくサイズを最適化するオプション( '-Os'のような)が役に立ちます。 –
1)整列された拡張とは何の関係もありません。構造体は偶数アドレスに割り当てなければなりません。 – Lundin