Como essa pergunta ficou um pouco congelada na SO, decidi excluí-la e tentar aqui. Se você acha que ele também não se encaixa aqui, pelo menos deixe um comentário na sugestão de como encontrar um exemplo que eu estou procurando ...
Você pode dar um exemplo , onde o uso de V99s C99 oferece uma vantagem real sobre algo como os atuais mecanismos C ++ RAII Ceap-heap atuais?
O exemplo que estou procurando deve:
- Obtenha uma vantagem de desempenho facilmente mensurável (talvez 10%) sobre o uso de heap.
- Não tem uma boa solução alternativa, que não precisaria de toda a matriz.
- Beneficie realmente do tamanho dinâmico, em vez do tamanho máximo fixo.
- É improvável que cause excesso de pilha no cenário de uso normal.
- Seja forte o suficiente para tentar um desenvolvedor que precisa do desempenho para incluir um arquivo de origem C99 em um projeto C ++.
Adicionando alguns esclarecimentos sobre o contexto: refiro-me ao VLA como significou C99 e não incluído no padrão C ++: int array[n]
where n
é uma variável. E estou atrás de um exemplo de caso de uso em que ele supera as alternativas oferecidas por outros padrões (C90, C ++ 11):
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
Algumas ideias:
- Funções que utilizam varargs, que limitam naturalmente a contagem de itens a algo razoável, ainda não possuem nenhum limite superior útil no nível da API.
- Funções recursivas, onde pilha desperdiçada é indesejável
- Muitas pequenas alocações e liberações, onde a sobrecarga da pilha seria ruim.
- Manipulação de matrizes multidimensionais (como matrizes de tamanho arbitrário), onde o desempenho é crítico, e espera-se que pequenas funções sejam incorporadas muito.
- Do comentário: algoritmo simultâneo, em que a alocação de heap tem sobrecarga de sincronização .
A Wikipedia tem um exemplo que não atende aos meus critérios , porque a diferença prática de usar heap parece irrelevante, pelo menos sem contexto. Também não é ideal, porque sem mais contexto, parece que a contagem de itens pode muito bem causar estouro de pilha.
Nota: Estou especificamente após um código de exemplo, ou sugestão de um algoritmo que se beneficiaria disso, para eu implementar o exemplo eu mesmo.
alloca
, que eu acho que são basicamente a mesma coisa). Mas essa coisa multithread é boa, editando a pergunta para incluí-la!
malloc
comportamento do Linux está em conformidade com o padrão C.
alloca()
realmente superassemalloc()
em um ambiente multithread por causa da contenção de trava no último . Mas essa é uma extensão real, uma vez que matrizes pequenas devem usar apenas um tamanho fixo, e matrizes grandes provavelmente precisarão da pilha de qualquer maneira.