Ponteiros baseados (C++)
Específico da Microsoft
A palavra-chave __based permite declarar ponteiros baseados em ponteiros (ponteiros que são deslocamentos de ponteiros existentes).
type __based( base ) declarator
Comentários
Os ponteiros baseados em endereços de ponteiros são o único formato da palavra-chave __based válido em compilações de 32 bits e de 64 bits. Para os compiladores C/C++ de 32 bits da Microsoft, um ponteiro baseado é um deslocamento de 32 bits de uma base de ponteiro de 32 bits. Uma restrição semelhante é mantida para ambientes de 64 bits, onde um ponteiro baseado é um deslocamento de 64 bits da base de 64 bits.
Um uso para ponteiros baseados em ponteiros é para identificadores persistentes que contêm ponteiros. Uma lista vinculada que consiste em ponteiros baseados em um ponteiro pode ser salva em disco e depois ser recarregada em outro local na memória, com os ponteiros permanecendo válidos. Por exemplo:
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
O ponteiro vpBuffer é atribuído ao endereço da memória alocada em algum momento posterior no programa. A lista vinculada é realocada em relação ao valor de vpBuffer.
Dica
Os identificadores persistentes que contêm ponteiros também podem ser criados usando arquivos mapeados por memória.
Ao desreferenciar um ponteiro baseado, a base deve ser especificada explicitamente ou implicitamente conhecida na declaração.
Para compatibilidade com versões anteriores, _based é o sinônimo de __based.
Exemplo
O código a seguir demonstra a alteração de um ponteiro baseado alterando sua 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;
}