Borland の DOS 用 C/C++ コンパイラは、複数のメモリ モデルをサポートしていました。
メモリ モデルは、ポインターを介してコードとデータにアクセスする方法です。
DOS はいわゆるCPU で動作し、aと an のreal mode
ペア(通常はそれぞれ 16 ビット長) を介してメモリにアクセスするため、メモリ アドレスは当然 4 バイト長になります。segment value
offset value
ただし、セグメント値を常に明示的に指定する必要はありません。プログラムがアクセスする必要があるすべてのものが 1 つsegment
(16 バイト境界に配置された 64KB のメモリ ブロック) に含まれている場合、1 つのセグメント値で十分であり、CPU のセグメント レジスタ (CS、SS、DS、ES) にロードされます。 、プログラムは16ビットのオフセットのみを使用してすべてにアクセスできます。ところで、多くの.COM
タイプのプログラムはまさにそのように動作し、1 つのセグメントのみを使用します。
したがって、メモリにアクセスするには、明示的なセグメント値を使用する方法と使用しない方法の 2 つの方法があります。
これらの行で:
char huge *near *far *ptr1;
char near *far *huge *ptr2;
char far *huge *near *ptr3;
修飾子far
、huge
およびが指すオブジェクトのnear
近接を指定します。これらは、およびオブジェクトがプログラムのメイン/現在のセグメントから「遠く離れている」ことをコンパイラに伝えます。オブジェクトはプログラム自身のセグメント内の「近く」にあり、2 バイトのポインターで十分です。ptr1
ptr2
ptr3
*ptr1
*ptr2
*ptr3
これは、さまざまなポインターのサイズを説明しています。
プログラムをコンパイルするために選択したメモリ モデルに応じて、関数およびデータ ポインターはデフォルトでnear
orfar
またはhuge
のいずれかになり、デフォルト以外のポインターが必要でない限り、それらを明示的に指定する必要がなくなります。
プログラム メモリ モデルは次のとおりです。
- tiny: すべてに対して 1 つのセグメント。ポインターの近く
- 小: 1 コード セグメント、1 データ/スタック セグメント。ポインターの近く
- 中: 複数のコード セグメント、1 つのデータ/スタック セグメント。far コード ポインター、near データ ポインター
- コンパクト: 1 つのコード セグメント、複数のデータ セグメント。Near コード ポインタ、Far データ ポインタ
- 大: 複数のコードおよびデータ セグメント。遠いポインター
- huge: 複数のコードとデータ セグメント。巨大なポインター
Huge
ポインターには、ポインターの特定の制限はありませんがfar
、操作が遅くなります。