2

gccで定義された変数のアライメントを明示的に無効にするにはどうすればよいですか?
次のコードを使用します。

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

... などになります。

しかし、物事は正しくないようです。

代わりに、は 0x522 、 0x542 、 0x552

&memstrx[1]のアドレスを表示します
&memstrx[2]
&memstrx[3]

...などなど。

GCC が暗黙のうちに構造体のサイズを (24 バイトから) 32 バイトに変更し、(各エントリの 64 ビット アラインメント) を強制したのではないかと思います。そして、この構造だけでこの動作が必要なわけではありません。その構造を整列させないようにGCCにどのように指示すればよいですか?

4

3 に答える 3

6

いいえ、できません。

表示される構造の最小サイズは 8*4 = 32 バイトです。

sizeof(unsigned long) = 64 ビット アーキテクチャ (Linux) では 8

編集:使用する場合

-unsigned代わりにunsigned long

また

  • uint32_tuint64_tの代わりunsigned longunsigned long long

期待されるアライメントが得られます。

于 2011-02-03T08:07:05.583 に答える
2

#pragma pack(x) は、GCC と MSVC の両方で構造アラインメントの制限を変更できます。

GCC は 64 ビット ビルドに LP64 モデルを使用します。つまり、long とポインターは 64 ビットです。32 ビット フィールドの場合は unsigned int に変更するか、安定したフィールド サイズの場合は uint32_t と uint64_t を使用する必要があります。

#pragma pack(1)

typedef struct{
  unsigned long long offset;
  unsigned long long size;
  unsigned int type;
  unsigned int acpi;
}memstruct;

#pragma pack()
于 2011-02-03T08:11:40.457 に答える
1

gcc を使用してアライメントを制御するオプションの 1 つを次に示します。

http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

于 2011-02-03T08:09:30.573 に答える