Share via


Puntatori based (C++)

La __based parola chiave consente di dichiarare puntatori in base ai puntatori (puntatori che sono offset dai puntatori esistenti). La __based parola chiave è specifica di Microsoft.

Sintassi

type __based( base ) declarator

Osservazioni:

I puntatori basati sugli indirizzi del puntatore sono l'unica forma della __based parola chiave valida nelle compilazioni a 32 bit o a 64 bit. Per i compilatori C e C++ a 32 bit Microsoft un puntatore based è un offset a 32 bit di una base puntatore a 32 bit. Una restrizione analoga è presente per ambienti a 64 bit, in cui un puntatore based è un offset a 64 bit rispetto a una base a 64 bit.

Un utilizzo dei puntatori basati su puntatori è correlato agli identificatori persistenti che contengono puntatori. Un elenco collegato costituito da puntatori basati su un puntatore può essere salvato su disco e successivamente ricaricato in un'altra posizione della memoria, con i puntatori che rimangono validi. Ad esempio:

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

Il puntatore vpBuffer viene assegnato l'indirizzo di memoria allocata in un qualche punto successivo del programma. L'elenco collegato viene rilocato rispetto al valore vpBuffer.

Nota

Per rendere persistenti gli identificatori contenenti puntatori, è anche possibile usare file mappati alla memoria.

Quando si dereferenzia un puntatore based, la base deve essere specificata in modo esplicito o essere implicitamente nota tramite la dichiarazione.

Per la compatibilità con le versioni precedenti, _based è un sinonimo di __based a meno che non venga specificata l'opzione del compilatore /Za (Disabilita estensioni del linguaggio).

Esempio

Nel codice seguente viene illustrata la modifica di un puntatore based tramite la modifica della base relativa.

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

Vedi anche

Parole chiave
alloc_text