2

アプリケーションをsolarissparcからsolarisx86に移植していますが、これら2つのアーキテクチャ間で構造体のサイズの違いに遭遇しました。例えば; 私は次のような構造体を持っています

typedef struct mystructS
{
  double a;
  double b;
  double c;
  double d;
  double e;
  double f;
  double g;
  double h;
  double aa;
  double ab;
  double ac;
  double ad;
  double ae;
  double af
  double ag;
  double ah;
  int ba;
  int bb;
  int bc;
  char ca[256];
} mystructT;

sizeof(mystructT)Solaris X86で書き込むと、396が返されます

sizeof(mystructT)Solaris SPARCで書き込むと、400が返されます

私はただ興味があります、なぜこのようなことが起こるのですか?

編集:両方のsolarisシステムは32ビットです。

4

4 に答える 4

4

何らかの理由で(おそらく、doubleはx86ではなくsparcに配置する必要がありますか?)、次の構造体が64ビット境界に配置されていることを確認しようとしているようです。

つまり、メモリ内のsizeof(mystructT)ステップをジャンプし、構造体の先頭を指すようにするために(たとえば、構造体の配列を作成する場合、これは、それを反復処理するときに行うことです。 )、構造体は最後にパディングする必要があります。

于 2010-02-22T09:13:51.567 に答える
2

SPARCが64ビットの場合、コンパイラはcaを境界に揃えようとする可能性があります。つまり、bcとcaの間に余分な4バイトが埋め込まれます。その場合は、パディングバイトが追加されないように構造体をパックするようコンパイラーに要求できますが、そのように指示する方法は、コンパイラーに少し依存する傾向があります。

于 2010-02-22T09:06:31.893 に答える
0

構造体メンバーのパディングと配置は常に実装によって定義されるため、構造体のサイズについては決して想定しないでください(同じプラットフォーム上の同じコンパイラーの異なるバージョン間、または異なる最適化設定を持つ同じコンパイラー間でも)。

特定のアライメントとパッキングが必要な場合は、これを実現するためにコンパイラ固有のディレクティブを使用する必要があります。これは、コマンドラインコンパイルオプション、#pragmaディレクティブ、またはGCCおよびその他のコンパイラ__attribute__仕様による場合があります。または、おそらくより堅牢に(ただしより多くの作業が)データのシリアル化を使用します。

于 2010-02-22T10:21:19.170 に答える
0

ほとんどの場合、alignof(double)1つのコンパイラで8、もう1つのコンパイラで4です。

構造体のアラインメントは、そのフィールドのアラインメントの最小公倍数としてコンパイルされます。この特定のケースでは、のアラインメントをdouble決定するアラインメントを意味しstruct mystructSます。

構造体のサイズは、その配置の倍数である必要があります(これは、そのような構造体の配列を作成した場合にうまく機能するためです)。したがって、構造体の配置が8であるコンパイラーも、最後にパディングを追加して、サイズを8の倍数に切り上げる必要があります。

于 2010-02-22T11:41:23.183 に答える