• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:16バイトアライメントで配置された要素へのポインタ)

16バイトアライメントで要素へのポインタ

このQ&Aのポイント
  • C言語で16バイトアライメント配置された要素へのポインタの処理方法について教えてください。
  • 1MBの範囲にある要素へのポインタを16ビットで記憶する方法をC言語で実現できるでしょうか。
  • C言語で、要素へのポインタを16バイトアライメントで配置し、指定の条件でアセンブラコードが生成できる方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.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); と書けます。

usatan2
質問者

お礼

回答ありがとうございます。 インデックスとして扱うというのはすばらしいアイデアですね。 これならば、16バイトアライメントでなくても、使えますよね。 参考になりました。

その他の回答 (1)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

メモリ管理自前でやってるシステムだと余ったビットを流用とかは、割とやってた。例えば 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 なんたらの前提条件が怪しいけど。

usatan2
質問者

お礼

早速の回答、ありがとうございます。 >もっとも eax とか書いてるのを見ると、そもそも 20bit なんたらの前提条件が怪しいけど。 eaxはあくまで説明用です。実際は組み込み機器のCPUなので、アセンブリコードはまったく別ものです。

関連するQ&A