Pergunta

Foi-me dito que um identificador é uma espécie de ponteiro, mas não, e que lhe permite manter uma referência a um objeto, em vez do próprio objeto. O que é uma explicação mais elaborada?

Foi útil?

Solução

A alça pode ser qualquer coisa de um índice inteiro para um ponteiro para um recurso no espaço de kernel. A ideia é que eles fornecem uma abstração de um recurso, para que você não precisa saber muito sobre o próprio recurso para usá-lo.

Por exemplo, o HWND na Win32 API é um identificador para uma janela. Por si só é inútil: você não pode recolher todas as informações a partir dele. Mas passá-lo para as funções da API certas, e você pode executar uma grande variedade de truques diferentes com ele. Internamente você pode pensar o HWND como apenas um índice na tabela das janelas do GUI (que pode não ser necessariamente como ele é implementado, mas faz sentido magia make).

EDIT: Não 100% de certeza que especificamente você estavam pedindo na sua pergunta. Isto é principalmente falando pura C / C ++.

Outras dicas

Um identificador é um ponteiro ou índice com nenhum tipo visível a ela ligada. Normalmente você ver algo como:

 typedef void* HANDLE;
 HANDLE myHandleToSomething = CreateSomething();

Assim, em seu código que você acabou de passar PUNHO em torno de como um valor opaco.

No código que usa o objeto, que lança o ponteiro para um tipo de estrutura real e usa-lo:

 int doSomething(HANDLE s, int a, int b) {
     Something* something = reinterpret_cast<Something*>(s);
     return something->doit(a, b);
 }

ou usa-lo 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 na medida em que é tipicamente uma forma de fazer referência a alguma entidade.

Seria mais correto dizer que um ponteiro é um tipo de alça, mas nem todas as alças são ponteiros.

Por exemplo, uma pega pode também ser algum índice para uma tabela na memória, o que corresponde a uma entrada que se contém um apontador para um objecto.

A principal coisa é que quando você tem uma "alça", você não conhecem nem o cuidado como que pega realmente acaba identificando a coisa que ele identifica, tudo o que você precisa saber é que ele faz.

Ele também deveria ser óbvio que não existe uma resposta única para "o que exatamente é um identificador", porque alças para coisas diferentes, mesmo no mesmo sistema, pode ser implementado de maneiras diferentes "sob a capa". Mas você não precisa se preocupar com essas diferenças.

C ++ / CLI, um identificador é um apontador para um objecto situado na pilha GC. Criando um objeto na (não gerido) C ++ pilha é conseguida utilizando new e o resultado de uma expressão new é um ponteiro "normal". Um objecto de gestão é alocado no (gestão) montão de GC com uma expressão gcnew. O resultado será uma alça. Você não pode fazer aritmética de ponteiro em alças. Você faz alças não livres. O GC irá cuidar deles. Além disso, a GC é livre para mudar 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 Handle-Body-Idiom , também chamado Pimpl idioma. Ele permite um para manter a ABI (interface binária) de uma biblioteca o mesmo, mantendo os dados reais em um outro objeto de classe, que é apenas referenciado por um ponteiro realizada em um objeto "alça", que consiste de funções que delegado para essa classe " Corpo".

Também é útil para permitir a constante de tempo e de exceção troca segura de dois objetos. Para isso, apenas o ponteiro apontando para o objeto corpo tem que ser trocada.

A alça é o que você quiser que ele seja.

Um identificador pode ser um inteiro não assinado usado em alguns tabela de pesquisa.

Um identificador pode ser um ponteiro para, ou em, um conjunto maior de dados.

Depende de como o código que usa os comporta punho. Que determina o tipo de identificador.

A razão o termo ' alça ' é usado é que é importante. Isso indica-los como uma identificação ou acesso tipo de objeto. Ou seja, para o programador, elas representam uma 'chave' ou acesso a algo.

HANDLE hnd; é o mesmo que void * ptr;

identificador é um typedef definido no arquivo winnt.h no Visual Studio (Windows):

typedef void *HANDLE;
PUNHO

Leia mais sobre

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top