次のローカル変数があります (スタックに格納されます)。
struct test1 {
int a;
int b;
char c;
};
a
整数の開始アドレスをスタック内の16byte
境界に揃えるにはどうすればよいですか?
この C コードをカスタム作成の MIPS ISA プロセッサで実行しています。
これは、データを整列するための非標準的な方法です。
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);
}
私の知る限り、この場合、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
};
残念ながら、そのようにオブジェクトを整列させる標準的な方法はありません。ほとんどの場合__attribute__
、GCC などのコンパイラ固有のトリックがありますが、コンパイラのドキュメントを確認する必要があります。
(もちろん、そのようなアラインメントの標準的な使用方法もありません。そのため、それを達成するための標準的な方法はありません。したがって、おそらくすでに拡張機能に頼っているので、さらに進んでも実際の害はありません。)
十分な大きさの要素オブジェクトを含む共用体はしばしばトリックを実行しますが、MIPS CPU の最大の要素 C オブジェクトはlong long
と でありdouble
、これはわずか 8 バイトです。