gccの定義済み変数のアライメントを明示的に無効にするにはどうすればよいですか?
は、このコードを取る:GCCの暗黙的な配置問題。 (64ビットコード)
typedef struct{
unsigned long long offset;
unsigned long long size;
unsigned long type;
unsigned long acpi;
}memstruct;
memstruct *memstrx;
これは24バイトの大きさを有する構造を定義します。私がやってみました
:
memstrx=(void*)(0x502);
ので
&memstrx[0]
はようになど0x502
&memstrx[1]
の価値を持って、0x51A
&memstrx[2]
、0x532
...とすべきです。
しかし、物事は正しいとは思われません。
&memstrx[1]
代わり
&memstrx[2]
のアドレス、
&memstrx[3]
0x542、0x552
を表示します。
私は、GCCが構造を32バイト(24バイトから)に暗黙的にサイズ変更して、(各エントリの64ビットアライメント)を強制すると思われます。そして、私は本当にこの構造のためだけにこの動作を望んでいません。どのようにGCCにその構造を揃えないように伝えるべきですか?
「最小サイズは8×4 = 32バイトではありません」という意味は、構造のサイズですか? – prinzrainer
@prinzrainer - 私の答えをもう一度読んでください:sizeof(long)= 8 not 4 – Artyom
Artyomは、64ビットマシン上で 'unsigned long'が8バイトであることを意味します。 32ビットが必要な場合は普通の 'unsigned'を使用するか、大きさが異なる可能性のある型ではなく正確なサイズの型(' uint32_t'と 'uint64_t')を使用する方が良いでしょう。 –