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