Wskaźniki bazowe (C++)

Słowo __based kluczowe umożliwia deklarowanie wskaźników na podstawie wskaźników (wskaźników, które są przesunięciami z istniejących wskaźników). Słowo __based kluczowe jest specyficzne dla firmy Microsoft.

Składnia

type __based( base ) declarator

Uwagi

Wskaźniki oparte na adresach wskaźników są jedyną formą słowa kluczowego prawidłowego __based w kompilacjach 32-bitowych lub 64-bitowych. W przypadku kompilatora microsoft 32-bitowego języka C/C++ wskaźnik oparty jest 32-bitowym przesunięciem z 32-bitowej bazy wskaźnika. Podobne ograniczenie dotyczy środowisk 64-bitowych, w których wskaźnik oparty jest 64-bitowym przesunięciem z 64-bitowej bazy.

Jednym z nich jest użycie wskaźników opartych na wskaźnikach w przypadku identyfikatorów trwałych zawierających wskaźniki. Połączona lista składająca 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, a wskaźniki pozostają prawidłowe. Przykład:

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

Wskaźnik vpBuffer jest przypisywany adres pamięci przydzielonej w pewnym późniejszym momencie w programie. Połączona lista jest przenoszona względem wartości vpBuffer.

Uwaga

Utrwalanie identyfikatorów zawierających wskaźniki można również osiągnąć za pomocą plików mapowanych w pamięci.

W przypadku wyłuskania wskaźnika opartego baza musi być jawnie określona lub niejawnie znana za pomocą deklaracji.

Aby uzyskać zgodność z poprzednimi wersjami, _based jest synonimem, __based chyba że określono opcję kompilatora /Za (Wyłącz rozszerzenia języka).

Przykład

Poniższy kod demonstruje zmianę wskaźnika opartego na zmianie podstawy.

// 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ż

Słowa kluczowe
alloc_text