ベースのポインター (C++)
Microsoft 固有の仕様 →
__based のキーワードはポインターを既存のポインターからのオフセットであるポインターできます (ポインターに基づいて宣言する必要があります。
type __based( base ) declarator
解説
ポインター アドレスに基づいてポインターは32 ビットまたは 64 ビット コンパイルで有効な __based のキーワードの形式です。Microsoft C/C++ 32 ビット コンパイラではベースのポインターは 32 ビット ポインターのベースから 32 ビット オフセットです。ベースのベース ポインターが 64 ビットから 64 ビットのオフセットである 64 ビット環境と同様の制限に保持されます。
ポインターに基づいてポインターの 1 とおりの使用はポインターを含む永続的な識別子になります。ポインターのポインターに基づいて構成されるリンク リストがディスクに保存され有効になっているポインターがメモリ内の別の場所に再度読み込むことができます。次に例を示します。
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
vpBuffer ポインターはプログラムの後に割り当てられているメモリのアドレスを割り当てます。リンク リストは vpBuffer の相対値に移動します。
[!メモ]
ポインターを含むセッション ID はメモリマップトファイル を使用して実行できます。
ベースのポインターを逆参照する場合は基数は宣言で明示的に指定するか暗黙的に認識する必要があります。
以前のバージョンとの互換性のために**_based** は __based のシノニムです。
使用例
次のコードは基本クラスの変更によって既存のポインターを変更することを示します。
// based_pointers2.cpp
// compile with: /EHsc
#include <iostream>
int a1[] = { 1,2,3 };
int a2[] = { 10,11,12 };
int *pBased;
typedef int __based(pBased) * pBasedPtr;
using namespace std;
int main() {
pBased = &a1[0];
pBasedPtr pb = 0;
cout << *pb << endl;
cout << *(pb+1) << endl;
pBased = &a2[0];
cout << *pb << endl;
cout << *(pb+1) << endl;
}