- ベストアンサー
16バイトアライメントで要素へのポインタ
- C言語で16バイトアライメント配置された要素へのポインタの処理方法について教えてください。
- 1MBの範囲にある要素へのポインタを16ビットで記憶する方法をC言語で実現できるでしょうか。
- C言語で、要素へのポインタを16バイトアライメントで配置し、指定の条件でアセンブラコードが生成できる方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
struct ABC { unsigned short next; int x,y,z; : } *p,*q; としておいて、 next を「(struct ABC*)NULL を基点とした長大な配列」へのインデックス として取り扱う、というのはどうでしょうか。 同型のポインタ同士の引き算は要素サイズ単位での差に、 ポインタと整数の足し算は、要素サイズ単位での実アドレス計算になりますから、 q = p->next; の代わりに q = ((struct ABC*)NULL) + p->next; q->next = p; の代わりに q->next = p-((struct ABC*)NULL); になります。 #define PointerToIndex(PTR) (PTR-((struct ABC*)NULL)) #define IndexToPointer(IDX) (((struct ABC*)NULL)+IDX) とでもしておけば、 q=IndexToPointer(p->next); q->next=PointerToIndex(p); と書けます。
その他の回答 (1)
- trapezium
- ベストアンサー率62% (276/442)
メモリ管理自前でやってるシステムだと余ったビットを流用とかは、割とやってた。例えば sizeof(struct ABC *)==4 なシステムなら丁度 16bit 浮くので、 struct ABC { unsigned short next; short padding; /* 穴埋め、他に流用可能みたいな */ int x,y,z; : } *p,*q; q = (struct ABC *)((unsigned long)p->next << 4); q->next = (unsigned short)((unsigned long)p >> 4); もっとも eax とか書いてるのを見ると、そもそも 20bit なんたらの前提条件が怪しいけど。
お礼
早速の回答、ありがとうございます。 >もっとも eax とか書いてるのを見ると、そもそも 20bit なんたらの前提条件が怪しいけど。 eaxはあくまで説明用です。実際は組み込み機器のCPUなので、アセンブリコードはまったく別ものです。
お礼
回答ありがとうございます。 インデックスとして扱うというのはすばらしいアイデアですね。 これならば、16バイトアライメントでなくても、使えますよね。 参考になりました。