Baseado em ponteiros (C++)
Específicos do Microsoft
O __based palavra-chave permite declarar ponteiros baseados em ponteiros (os ponteiros são deslocamentos de ponteiros existentes).
type __based( base ) declarator
Comentários
Com base nos endereços de ponteiro de ponteiros são a única forma do __based a palavra-chave válida em compilações de 32 bits ou 64 bits.Para o compilador C/C++ da Microsoft de 32 bits, um ponteiro com base é um deslocamento de 32 bits de um ponteiro de 32 bits com base.Uma restrição semelhante mantém para ambientes de 64 bits, onde um ponteiro com base é um deslocamento de 64 bits da base de dados de 64 bits.
Um uso baseada em ponteiros de ponteiros é para identificadores persistentes que contêm ponteiros.Uma lista vinculada que consiste em ponteiros com base em um ponteiro pode ser salvo no disco e recarregada para outro local na memória, com os ponteiros restantes válido.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 o endereço de memória alocada em algum momento posterior no programa.A lista vinculada é realocada em relação ao valor de vpBuffer.
Observação |
---|
Identificadores persistentes que contêm ponteiros também podem ser realizadas por meio de arquivos mapeados na memória. |
Ao cancelar a referência de um ponteiro com base, a base deve ser especificado explicitamente ou implicitamente conhecido por meio da declaração.
Para compatibilidade com versões anteriores, _based é um sinônimo de __based.
Exemplo
O código a seguir demonstra como alterar um ponteiro com base, 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;
}