15

元のMIX アーキテクチャは 6 ビット バイトを特徴とし、メモリは 31 ビット ワード (5 バイトと符号ビット) としてアドレス指定されます。思考練習として、C 言語がこの環境でどのように機能するのか疑問に思っています。

  • char には少なくとも 8 ビットがあります (C99 仕様の附属書 E)
  • C99 仕様セクション 6.3.2.3 (「ポインター」) パラグラフ 8 には、「オブジェクトへのポインターが文字型へのポインターに変換されると、結果はオブジェクトのアドレス指定された最下位バイトを指します。結果の連続的なインクリメント、アップオブジェクトのサイズに、オブジェクトの残りのバイトへのポインターを生成します。」この要件についての私の解釈は、「memcpy(&dst_obj, &src_obj, sizeof(src_obj))」を支えているというものです。

私が考えることができるアプローチ:

  1. char を 31 ビットにするため、"char*" による間接参照は単純なメモリ アクセスです。しかし、これは文字列を無駄にします(明らかに8ビット文字が必要なため、POSIXに準拠していないことを意味します)
  2. 3 つの 8 ビット文字を 1 つのワードにパックし、7 ビットを無視します。「char*」は、ワード アドレスとその中の文字インデックスで構成される場合があります。ただし、これは 6.3.2.3 に違反しているようです。つまり、memcpy() は無視されたビットをスキップする必要があります (実際のオブジェクト タイプではおそらく意味がある)。
  3. char を単語に完全にパックします。たとえば、4 番目の 8 ビット char は、word 0 に 7 ビット、word 1 に 1 ビットを持ちます。これにも memcpy() 問題があるため、ワード長に一致するように宣言されています。

したがって、すべてのオブジェクトのサイズが char の倍数である 31 ビット char を使用するという最初の (無駄な) オプションが残っているようです。このように読むのは正しいですか?

4

2 に答える 2

2

最も実用的なアプローチは、おそらくint30 ビットにしchar、10 または 15 にcharすることcharです。三。Unicode テキストのストレージは、10 バイトまたは 15 バイトのどちらでもかなり効率的charです。15-bytecharでは、約 30720 のコード ポイントに 15 ビットが必要でchar、残りは 30 になります。

3 で割るコストを軽減するには、それぞれchar*に 2 つの単語を含めると役立つ場合があります。1 つはその文字を含む単語を識別し、もう 1 つはその単語の先頭からのオフセットを文字単位で識別します。正規化されていることがわかっているポインターに定数オフセットを追加するには、次のようなコードを使用できます。

p += 5; // Becomes...
if (p.offset) { p.offset=2; p.base+=1; }
else { p.offset--; p.base+=2; }

素晴らしいことではありませんが、「分割」ステップの必要性を回避できます。

于 2015-05-05T15:34:18.007 に答える