ベース ポインター (C++)Based Pointers (C++)

Microsoft 固有の仕様Microsoft Specific

__Basedキーワードを使用すると、ポインター (既存のポインターからのオフセットであるポインター) に基づいてポインターを宣言できます。The __based keyword allows you to declare pointers based on pointers (pointers that are offsets from existing pointers).

構文Syntax


type __based( base ) declarator

RemarksRemarks

ポインターアドレスに基づくポインターは、32ビットまたは64ビットのコンパイルで有効な __basedキーワードの唯一の形式です。Pointers based on pointer addresses are the only form of the __based keyword valid in 32-bit or 64-bit compilations. Microsoft の 32 ビット C/C++ コンパイラでは、based ポインターは 32 ビットのポインター ベースからの 32 ビットのオフセットになります。For the Microsoft 32-bit C/C++ compiler, a based pointer is a 32-bit offset from a 32-bit pointer base. 同様の制限は 64 ビット環境にもあり、based ポインターは 64 ビット ベースからの 64 ビット オフセットになります。A similar restriction holds for 64-bit environments, where a based pointer is a 64-bit offset from the 64-bit base.

ポインターに基づいたポインターの使用方法の 1 つは、ポインターを含む永続的な識別子での使用です。One use for pointers based on pointers is for persistent identifiers that contain pointers. ポインターに基づくポインターで構成されるリンク リストをディスクに保存でき、メモリ内の別の場所に再読み込みしても、ポインターは有効なままです。A linked list that consists of pointers based on a pointer can be saved to disk, then reloaded to another place in memory, with the pointers remaining valid. 例えば:For example:

// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
   void __based( vpBuffer ) *vpData;
   struct llist_t __based( vpBuffer ) *llNext;
};

ポインター vpBuffer には、プログラムの後の段階で割り当てられるメモリ アドレスが代入されます。The pointer vpBuffer is assigned the address of memory allocated at some later point in the program. リンク リストは vpBuffer の値を基準として再配置されます。The linked list is relocated relative to the value of vpBuffer.

注意

ポインターを含む識別子の永続化は、メモリマップトファイルを使用して行うこともできます。Persisting identifiers containing pointers can also be accomplished by using memory-mapped files.

based ポインターを逆参照する場合、ベースは、明示的に指定されているか、または宣言によって暗黙的に認識されている必要があります。When dereferencing a based pointer, the base must be either explicitly specified or implicitly known through the declaration.

以前のバージョンとの互換性を維持するために、 _basedは、 (コンパイラオプションである [言語拡張を無効にする] が指定されていない限り、__based のシノニムです。For compatibility with previous versions, _based is a synonym for __based unless compiler option /Za (Disable language extensions) is specified.

Example

次のコードは、ベースの変更による based ポインターの変更を示します。The following code demonstrates changing a based pointer by changing its base.

// 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;
}
1
2
10
11

関連項目See also

キーワードKeywords
alloc_textalloc_text