Disseram-me que um identificador é uma espécie de ponteiro, mas não, e que permite manter uma referência a um objeto, em vez do próprio objeto. O que é uma explicação mais elaborada?
Disseram-me que um identificador é uma espécie de ponteiro, mas não, e que permite manter uma referência a um objeto, em vez do próprio objeto. O que é uma explicação mais elaborada?
Respostas:
Um identificador pode ser qualquer coisa, desde um índice inteiro a um ponteiro para um recurso no espaço do kernel. A ideia é que eles forneçam uma abstração de um recurso, então você não precisa saber muito sobre o recurso em si para usá-lo.
Por exemplo, o HWND na API Win32 é um identificador para uma janela. Por si só, é inútil: você não pode obter nenhuma informação dele. Mas passe-o para as funções de API corretas e você poderá executar uma variedade de truques diferentes com ele. Internamente, você pode pensar no HWND apenas como um índice na tabela de janelas da GUI (que pode não ser necessariamente como ele é implementado, mas faz a mágica fazer sentido).
EDIT: Não tenho 100% de certeza do que você estava perguntando especificamente em sua pergunta. Isso se refere principalmente a C / C ++ puro.
Um identificador é um ponteiro ou índice sem tipo visível anexado a ele. Normalmente você vê algo como:
typedef void* HANDLE;
HANDLE myHandleToSomething = CreateSomething();
Portanto, em seu código, você apenas passa HANDLE como um valor opaco.
No código que usa o objeto, ele lança o ponteiro para um tipo de estrutura real e o usa:
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
Ou ele o usa como um índice para uma matriz / vetor:
int doSomething(HANDLE s, int a, int b) {
int index = (int)s;
try {
Something& something = vecSomething[index];
return something.doit(a, b);
} catch (boundscheck& e) {
throw SomethingException(INVALID_HANDLE);
}
}
Um identificador é uma espécie de ponteiro, pois normalmente é uma forma de referenciar alguma entidade.
Seria mais preciso dizer que um ponteiro é um tipo de identificador, mas nem todos os identificadores são ponteiros.
Por exemplo, um identificador também pode ser algum índice em uma tabela na memória, que corresponde a uma entrada que contém um ponteiro para algum objeto.
O principal é que quando você tem um "identificador", você não sabe nem se importa como esse identificador realmente acaba identificando o que ele identifica, tudo o que você precisa saber é que ele identifica.
Também deveria ser óbvio que não há uma resposta única para "o que exatamente é uma alça", porque alças para coisas diferentes, mesmo no mesmo sistema, podem ser implementadas de maneiras diferentes "por baixo do capô". Mas você não precisa se preocupar com essas diferenças.
Em C ++ / CLI, um identificador é um ponteiro para um objeto localizado na pilha de GC. A criação de um objeto no heap C ++ (não gerenciado) é obtida usando new
e o resultado de uma new
expressão é um ponteiro "normal". Um objeto gerenciado é alocado no heap do GC (gerenciado) com uma gcnew
expressão. O resultado será uma alça. Você não pode fazer aritmética de ponteiro em alças. Você não libera alças. O CG cuidará deles. Além disso, o GC está livre para realocar objetos no heap gerenciado e atualizar as alças para apontar para os novos locais enquanto o programa está em execução.
Isso aparece no contexto do idioma Handle-Body-Idiom , também chamado de idioma Pimpl. Ele permite manter a ABI (interface binária) de uma biblioteca igual, mantendo os dados reais em outro objeto de classe, que é meramente referenciado por um ponteiro mantido em um objeto "manipulador", consistindo de funções que delegam a essa classe " Corpo".
Também é útil para permitir tempo constante e troca segura de exceção de dois objetos. Para isso, basta trocar o ponteiro que aponta para o objeto do corpo.
Uma alça é o que você quiser.
Um identificador pode ser um inteiro sem sinal usado em alguma tabela de pesquisa.
Um identificador pode ser um ponteiro para ou para um conjunto maior de dados.
Depende de como o código que usa o identificador se comporta. Isso determina o tipo de alça.
O motivo pelo qual o termo ' identificador ' é usado é o que é importante. Isso os indica como uma identificação ou tipo de objeto de acesso. Ou seja, para o programador, eles representam uma 'chave' ou acesso a algo.
HANDLE hnd;
é o mesmo que void * ptr;
HANDLE é um typedef definido no arquivo winnt.h no Visual Studio (Windows):
typedef void *HANDLE;
Leia mais sobre HANDLE