3

次のローカル変数があります (スタックに格納されます)。

struct test1 {
  int a;
  int b;
  char c;
};

a整数の開始アドレスをスタック内の16byte境界に揃えるにはどうすればよいですか?

この C コードをカスタム作成の MIPS ISA プロセッサで実行しています。

4

3 に答える 3

2

これは、データを整列するための非標準的な方法です。

struct test1 *pdata;

// here we assume data on stack is word aligned
pdata = alloca(sizeof(*pdata) + 14);
if (pdata & 0xF)
{
    pdata = (unsigned char*)pdata + 16 - (pdata & 0xF);
}
于 2013-03-16T19:50:50.653 に答える
1

私の知る限り、この場合、MIPS ISA C コンパイラはワード境界に強制的に揃えられます。構造体に int (32 ビット) を追加するだけです。それで:

struct test1 {
   int a;       // 4 bytes
   int b;       // 4 bytes
   int foralign;// 4 bytes for 16 byte alignment
   char c;      // 1 byte but will be aligned 4 bytes

};
于 2013-03-16T19:51:04.563 に答える
1

残念ながら、そのようにオブジェクトを整列させる標準的な方法はありません。ほとんどの場合__attribute__、GCC などのコンパイラ固有のトリックがありますが、コンパイラのドキュメントを確認する必要があります。

(もちろん、そのようなアラインメントの標準的な使用方法もありません。そのため、それを達成するための標準的な方法はありません。したがって、おそらくすでに拡張機能に頼っているので、さらに進んでも実際の害はありません。)

十分な大きさの要素オブジェクトを含む共用体はしばしばトリックを実行しますが、MIPS CPU の最大の要素 C オブジェクトはlong longと でありdouble、これはわずか 8 バイトです。

于 2013-03-16T20:13:57.077 に答える