1

主題が言うように、同じ構造を計算する同じ操作の異なる結果を得ました。構造体は以下です。

struct test
{
  char m1;
  double d1;
}

Linux で gcc-4.6.3 と gcc-4.2 で sizeof(struct test) を使用して計算すると、「12」という結果が得られました。Linux で gcc-4.6.1 を使用し、WinXP で VC 6.0 を使用しているときに、「16」という結果が得られました。だから私は混乱しています、なぜこれが起こるのですか?GCCは構造体のサイズをどのように計算しますか?

追加した:

答えが言うように、arm linux は AAPCS 定義に 8 バイトのアラインメントを必要としますが、x86 の vc 6.0 が結果「16」を取得するのはなぜですか?VC 2003 以降を使用している人はいますか?

さらに、C89/C99 などの C 標準はこれを定義していますか?

4

2 に答える 2

2

Dave-Bの答えを補足するために、

gccの変更には、8 バイト境界で8 バイトを超えるベクトルを整列するための ABI の変更に関するメモが含まれています。ARM AAPCSの表 4.1 には、アライメントに関するドキュメントが記載されています。

プロシージャ コール ARM アーキテクチャの標準
4.1 基本的なデータ型
タイプ クラス バイト サイズ バイト アラインメント
整数 符号なし 8 8
             ダブルワード
浮動小数点 ダブル 8 8
ポイント 精度

これは、データがキャッシュ ラインにまたがらないため、一般的に有利です。また、メモリが整列されている場合、ARMldrdとは高速です。strdこれは、Cコンパイラの相互運用性に関する ARM 標準の一部であるためgcc、デフォルトでこれを行う必要があります。サイズを使用attribute(packed)して最適化すると、配置-Os 変わる場合があります。

多くの ARM プロセッサで使用される内部バスは 64 ビットです

参照: ARM C 呼び出し規約

于 2013-05-26T14:56:33.013 に答える