Devo ensinar alloca aos meus alunos? [fechadas]


18

Quão amplamente usado é allocano mundo real? Devo ensinar meus alunos a usar allocaquando faz sentido? Ou devo ensiná-los a nunca usá-lo? Vindo de um background C ++ RAII, a idéia de não precisar chamar freemanualmente parece promissora, especialmente em funções com vários pontos de saída.


Você pode

8
Por que não ensinar a eles C99 VLAs?

@cnicutar alloca () depende da implementação, mas pelo menos muitas implementações retornam NULL em caso de falha. Os VLAs C99 não têm como indicar falha.
Complicado ver biografia

2
@sbi: Para SO, essa é uma pergunta aberta que realmente não se encaixa no formato do que os responsáveis ​​pelo fechamento pensam que o SO deve ser. É subjetivo demais, não há resposta clara, apenas opinião. O que é bom, mas não para o SO. Observe também que, por respeito ao representante do OP, ninguém está votando, estamos encerrando esta questão como fora de tópico.
Paul Sasik

1
@PascalCuoq Você não deve alocar muito com alloca / VLAs de qualquer maneira. Se não tiver certeza do que "muito" está no contexto atual, use malloc.

Respostas:


31

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.


O único uso que eu vi onde não seria melhor fazer outra maneira foi a detecção de empilhamento de pilhas em algumas versões do Windows, onde uma falha no alloca indicava espaço insuficiente restante - ou talvez tivesse apenas um ASM macabro para detectar a falha ; já faz um tempo desde que olhei para esse código. Funcionou, mas foi um pouco de horror.
Donal Fellows

13

Eu posso ver duas coisas acontecendo:

  1. Os alunos compreendem o impacto alloca, leem sobre as diferenças entre pilha e pilha e usam com allocacuidado. (improvável)

  2. Os alunos pensam "uau, é assim mallocsem se preocupar com o free", 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:

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

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.


1
Acho que a maioria dos estudantes ainda se enquadra na segunda categoria, mesmo depois de mostrar o código de exemplo.
rightfold

@WTP - Provavelmente, mas é por isso que você diz para não usá-lo, mesmo depois de mostrar o que pode acontecer.
BlackJack 31/10

4
Por que esse código usa em _allocavez de alloca? E por que lançar o resultado?
Keith Thompson

5

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 ...)


2

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é

  1. Inútil, isto é, poderia ser trivialmente substituído por variáveis ​​de tamanho fixo de duração de armazenamento automático, OU
  2. Um estouro de pilha perigoso esperando para acontecer.

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).


2
Obviamente, ninguém jamais poderia usá-lo com responsabilidade. Não nunca.
DeadMG

O único uso "responsável" de allocé 100% equivalente a matrizes automáticas de tamanho fixo e menos portátil.
R ..

Suponho, então, que ninguém jamais poderia alocar uma quantidade dinâmica, digamos, alguns kilobytes que nunca estourariam. Ou chame alguma função da API do sistema operacional que dirá quanto está disponível. Ou apenas aumente muito o tamanho da pilha.
DeadMG

Se tiver alguns KB e você tiver certeza de que tem alguns KB, basta usar T foo[5000];ou o que for.
R ..

Somente se T tiver um construtor padrão trivial. Se eu precisava de desempenho, mesmo o simples zeramento da memória poderia me custar. Mas outros tipos podem ter uma lógica de construção de padrão ainda mais complexa. Se eu quisesse, por exemplo, criar dinamicamente uma matriz de 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.
DeadMG

1

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.


0

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 usar alloca()ou alocar grandes matrizes temporárias ou usar recursão após uma certa profundidade dependente do contexto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.