Pergunta

Existem muitas desvantagens de usar void * em C (memória relacionada, tipo relacionado, eficiência sábio ...). Apesar deles podemos usá-los muito para a flexibilidade que eles fornecem.

Lista a desvantagens / inconvenientes utilizando void * (e solução preferida em C -, se possível).

EDIT: por favor, vá através do link follwoing: http: / /attractivechaos.wordpress.com/2008/10/02/using-void-in-generic-c-programming-may-be-inefficient/

Foi útil?

Solução

Não há questões de eficiência com ponteiros void. As únicas limitações com ponteiros void são:

  • você não pode excluir a referência ponteiro nulo por razões óbvias
  • sizeof(void) é ilegal
  • você não pode executar a aritmética de ponteiro sobre ponteiros void

No entanto GCC assume que sizeof(void) é 1 e permite aritmética ponteiro sobre ponteiros void - veja aqui

Outras dicas

Não concordo com a premissa da pergunta. Usamos void * em C, porque é a única maneira de obter polimorfismo. Exemplo: funções de biblioteca qsort e bsearch. Há apenas uma desvantagem, que é que o polimorfismo baseado em void * é inseguro: uma vez que você lançar um ponteiro para void *, não há nada que o impeça de vazamento que void * para o errado tipo de ponteiro, erro. Meus alunos cometem esse erro muitas vezes.

Pode haver um custo eficiência porque às vezes é necessário para alocar espaço de pilha, a fim de usar uma estrutura de dados polimórfico.

Qualquer um que queira ver as vantagens e desvantagens na utilização de estruturas de dados polimórficas com void * deve obter uma cópia do livro de Dave Hanson C Interfaces e Implementações

Uh ... eu não estou certo de que há muitas. Claro, você nunca deve usar void* quando você não tem que. Se há um tipo bem definido que você pode usar, em seguida, fazer isso.

Na minha experiência, void* é melhor para ponteiros "anônimos" (o que é um choque!), Como em valor de retorno do malloc(), e quando apenas lidar com buffers opacos de bits. Muitas vezes, você quer lidar com esses buffers no exemplo o nível de byte, e então você usaria unsigned char *, é claro.

Apenas usando aleatoriamente void* onde quer que você precisa de um ponteiro seria apenas quebrado, código mau cheiro, e deve ser evitado é claro.

As operações vinculadas-to pós compara com ponteiros void para operações com modelos C ++, e conclui que os modelos são mais eficientes. Isto não é uma surpresa, e o código C ++ que eu vi usos ponteiros void raramente ou nunca. Ele geralmente não oferece nenhuma vantagem sobre outras instalações C ++, e pode ser um buraco no sistema de tipo.

No entanto, C não tem C ++ - modelos de estilo, e ponteiros void são necessárias para implementar a funcionalidade que tem de ser independente do tipo de dados.

Portanto, quando você está escrevendo em C, e você precisa genericidade, ponteiros void são os meios mais eficientes de consegui-lo (já que eles são os únicos meios). Quando você está escrevendo em C ++, há melhores maneiras de fazer quase qualquer coisa ponteiros void pode realizar, por isso não usá-los.

Seu determinado link, é parcialmente verdadeiro. Especialmente, quando você não está lidando com objetos (estruturas), ou, em geral, com tipos que não são já alocados. Usando tipos nativos como ints, duplas etc e anular-ponteiros (por exemplo, para um recipiente) é quase sempre um caso icky, porque você quer ter a opção de lançar o int (para uma dupla Isso não funciona) para um ponteiro ou você precisa alocar memória extra para o tipo de dados.

A primeira escolha é ruim porque não é portátil, 0s talvez não são permitidos como um valor e ele simplesmente se sente mal. Segunda memória resíduos escolha e é de fato uma (enorme) abrandar por causa das alocações extras.

Mas na maioria dos casos, você não está lidando com tipos nativos, mas com os objetos, disse melhor com ponteiros para objetos, que já estão alocados, pelo menos eu faço. Eu nunca precisei de um hash-table ou um mapa para inteiros ou duplos. E ter diferentes implementações de recipiente somente para o tipo safeness de ponteiros parece errado para mim, porque cada implementação irá aumentar o tamanho do binário. Então, se você está apenas precisar de um recipiente para armazenar seus ponteiros, não há devagar ou resíduos de memória em usar vazios ponteiros.

Mas nota, isso era tudo sobre implementações de recipiente, como aliás o artigo do blog que você mencionou. Em geral, existem muitas coisas que você não pode realizar sem usar vazios ponteiros.

Eu não sei, eu descobri ponteiros void para ser bastante eficaz para acessar diferentes níveis de abstração (ABCs). Como um meio de navegação aulas interligados em níveis diferentes de abstracção. É simples assim, sua incrível. Como a fórmula para e ou a proporção áurea, deve haver uma oculto que adora o void * a sua tão grande :)

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