Quão amplamente usado é alloca
no mundo real? Devo ensinar meus alunos a usar alloca
quando faz sentido? Ou devo ensiná-los a nunca usá-lo? Vindo de um background C ++ RAII, a idéia de não precisar chamar free
manualmente parece promissora, especialmente em funções com vários pontos de saída.
18
malloc
.Respostas:
Se você está realizando um curso de programação C geral, não deve ensinar a eles algo que não esteja no padrão. Os programadores iniciantes que escrevem desnecessariamente códigos não padrão e / ou não portáteis porque foram ensinados dessa maneira têm sido um grande problema para a indústria de software nos últimos 20 a 30 anos. O custo de não ensinar a eles o padrão e nada além do padrão é provavelmente astronômico.
Se você está realizando um curso mais avançado em algoritmos ou programação de aplicativos, pode ser bom mencioná-lo. Por outro lado, programei tudo, desde aplicativos incorporados em tempo real até aplicativos de aplicativos do Windows por 15 anos sem nunca usar essa função.
fonte
Eu posso ver duas coisas acontecendo:
Os alunos compreendem o impacto
alloca
, leem sobre as diferenças entre pilha e pilha e usam comalloca
cuidado. (improvável)Os alunos pensam "uau, é assim
malloc
sem se preocupar com ofree
", usam excessivamente, sobrecarregam a pilha e não têm idéia do que está acontecendo.Eu acho que é muito melhor se você descrever
alloca
, então execute este código:Fonte: http://www.strchr.com/alloca
mostre-lhes os perigos e peça-lhes para não usá-lo. Eles ainda aprenderão sobre pilha versus pilha, verão os perigos em ação e poderão seguir adiante com coisas comuns.
fonte
_alloca
vez dealloca
? E por que lançar o resultado?A resposta a esta pergunta deve basear-se em quais são seus objetivos .
Deseja ensinar alguém que já sabe como programar como escrever C e trabalhar com o código C existente na natureza? Se assim for, conte sobre alloca e qualquer outra coisa que você quiser.
Por outro lado, se você estiver ministrando um curso introdutório que apenas usa C por coincidência (e porque C é uma linguagem muito pequena e assim por diante), você deve se concentrar nas partes importantes (escrever programas modulares, sub-rotinas, coleções, etc.). .). Do ponto de vista de um aluno, alloca é um pouco redundante, pois na maioria dos casos o malloc é suficiente e, do ponto de vista do código bom, é melhor mencionar explicitamente como o gerenciamento manual de memória é irritante e como outros idiomas lidam com esse problema. Afinal, existem mais coisas para gerenciamento de memória, então alloca ou RAII, para que você realmente não deva se restringir a elas e, como você já mencionou, é muito mais fácil entender o objetivo do alloca se você o comparar com outras maneiras "mais padrão" de fazer as coisas em outros idiomas. (ou C99 ...)
fonte
Não.
A única razão pela qual um programador C deve estar ciente da existência de alloca é entender e corrigir o código legado que está usando-o.
Qualquer uso de
alloca
éAlém de algumas experiências de pensamento para as quais nunca encontrei exemplos do mundo real, não há casos de uso
alloca
(ou VLAs) que não sejam inúteis ou vulneráveis (um dos dois casos acima).fonte
alloc
é 100% equivalente a matrizes automáticas de tamanho fixo e menos portátil.T foo[5000];
ou o que for.std::mutex
, eu poderia chamar uma chamada de kernel e uma alternância de contexto para cinco mil mutexes. Não é barato. Sem mencionar o custo adicional do cache de colocar variáveis locais após a matriz.Minha opinião é não encorajar usá-lo, a menos que você esteja ensinando princípios de compilador de baixo nível usados para alocar espaço de pilha para variáveis locais. Ensine nesse contexto.
fonte
A documentação do GCC possui algumas vantagens e desvantagens práticas
alloca()
. De uma perspectiva prática, uma quantidade decente de software livre o utiliza, portanto é bom entender como ele funciona e onde é usado no código existente.Passar o
-Wl,-stack=
novo tamanho da pilha para o gcc aumenta o tamanho máximo da pilha; você precisará fazer isso se o seu projeto usaralloca()
ou alocar grandes matrizes temporárias ou usar recursão após uma certa profundidade dependente do contexto.fonte