Wskaźniki bazowe (C++)Based Pointers (C++)

__based Słowo kluczowe umożliwia deklarowanie wskaźników na podstawie wskaźników (wskaźników, które są przesunięte z istniejących wskaźników).The __based keyword allows you to declare pointers based on pointers (pointers that are offsets from existing pointers). __based Słowo kluczowe jest specyficzne dla firmy Microsoft.The __based keyword is Microsoft-specific.

SkładniaSyntax

type __based( base ) declarator

UwagiRemarks

Wskaźniki oparte na adresach wskaźnika są jedyną formą __based słowa kluczowego, które są prawidłowe w kompilacjach 32-bitowych lub 64-bitowych.Pointers based on pointer addresses are the only form of the __based keyword valid in 32-bit or 64-bit compilations. W przypadku kompilatora Microsoft 32-bitowego C/C++ wskaźnik oparty jest 32-bitowym przesunięciem z bazy wskaźnika 32-bitowego.For the Microsoft 32-bit C/C++ compiler, a based pointer is a 32-bit offset from a 32-bit pointer base. Podobne ograniczenie jest przechowywane w środowiskach 64-bitowych, gdzie wskaźnik oparty jest 64-bitowym przesunięciem od 64-bitowego bazy.A similar restriction holds for 64-bit environments, where a based pointer is a 64-bit offset from the 64-bit base.

Jednym z nich użycia dla wskaźników opartych na wskaźnikach jest dla trwałych identyfikatorów, które zawierają wskaźniki.One use for pointers based on pointers is for persistent identifiers that contain pointers. Lista połączona, która składa się ze wskaźników opartych na wskaźniku, może zostać zapisana na dysku, a następnie ponownie załadowana do innego miejsca w pamięci, przy czym pozostałe wskaźniki są prawidłowe.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. Na przykład:For example:

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

Do wskaźnika vpBuffer przypisano adres pamięci przydzielonej w późniejszym czasie w programie.The pointer vpBuffer is assigned the address of memory allocated at some later point in the program. Połączona lista zostanie przeniesiona względem wartości vpBuffer .The linked list is relocated relative to the value of vpBuffer.

Uwaga

Identyfikatory utrwalane zawierające wskaźniki można także wykonać przy użyciu plików mapowanych na pamięć.Persisting identifiers containing pointers can also be accomplished by using memory-mapped files.

W przypadku wyłuskania wskaźnika bazowego należy jawnie określić lub niejawnie znany przez deklarację.When dereferencing a based pointer, the base must be either explicitly specified or implicitly known through the declaration.

W celu zapewnienia zgodności z poprzednimi wersjami _based jest synonimem, __based Jeśli nie określono opcji kompilatora /za ( disable Language Extensions) .For compatibility with previous versions, _based is a synonym for __based unless compiler option /Za (Disable language extensions) is specified.

PrzykładExample

Poniższy kod demonstruje zmianę wskaźnika bazowego, zmieniając jego podstawę.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

Zobacz teżSee also

Słowa kluczoweKeywords
alloc_textalloc_text