Pointeurs basés sur (C++)

Le __based mot clé vous permet de déclarer des pointeurs basés sur des pointeurs (pointeurs qui sont des décalages de pointeurs existants). Le __based mot clé est spécifique à Microsoft.

Syntaxe

type __based( base ) declarator

Notes

Les pointeurs basés sur des adresses de pointeur sont la seule forme du __based mot clé valide dans les compilations 32 bits ou 64 bits. Pour le compilateur Microsoft C/C++ 32 bits, un pointeur based est un décalage de 32 bits par rapport à une base de pointeur 32 bits. Une restriction similaire s'applique pour les environnements 64 bits, où un pointeur based est un décalage de 64 bits par rapport à la base 64 bits.

Les pointeurs basés sur pointeurs peuvent par exemple être utilisés pour des identificateurs persistants qui contiennent des pointeurs. Une liste liée composée de pointeurs basés sur un pointeur peut être enregistrée sur le disque, puis rechargée dans un autre emplacement mémoire, et les pointeurs restent valides. Par exemple :

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

Le pointeur vpBuffer reçoit l'adresse de la mémoire allouée à un point ultérieur dans le programme. La liste liée est déplacée par rapport à la valeur de vpBuffer.

Remarque

Des identificateurs persistants contenant des pointeurs peuvent également être effectués à l’aide de fichiers mappés en mémoire.

Lors du déréférencement d'un pointeur based, la base doit être spécifiée explicitement ou connue implicitement via la déclaration.

Pour la compatibilité avec les versions précédentes, _based est un synonyme de __based l’option du compilateur /Za (Désactiver les extensions de langage) spécifiée.

Exemple

Le code suivant illustre comment modifier un pointeur based en modifiant sa 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

Voir aussi

Mots clés
alloc_text