Compartilhar via


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;
}
  

Consulte também

Referência

Palavras-chave C++

alloc_text