Questa domanda ha avuto una ricezione piuttosto gelida a SO, quindi ho deciso di eliminarlo lì e provare invece qui. Se pensi che non si adatti neanche qui, per favore lascia almeno un commento su un suggerimento su come trovare un esempio che sto cercando ...
Puoi fare un esempio , in cui l'utilizzo di VLA C99 offre un reale vantaggio rispetto a qualcosa come gli attuali meccanismi RAII C ++ che utilizzano heap?
L'esempio che sto seguendo dovrebbe:
- Ottieni un vantaggio prestazionale facilmente misurabile (forse il 10%) rispetto all'uso dell'heap.
- Non ha una buona soluzione, che non avrebbe bisogno dell'intero array.
- Beneficia effettivamente dell'uso della dimensione dinamica, anziché della dimensione massima fissa.
- È improbabile che causi un overflow dello stack in uno scenario di utilizzo normale.
- Sii abbastanza forte da tentare uno sviluppatore che necessita delle prestazioni per includere un file sorgente C99 in un progetto C ++.
Aggiungendo alcuni chiarimenti sul contesto: intendo VLA come inteso da C99 e non incluso nello standard C ++: int array[n]
dove n
è una variabile. E sto cercando un esempio di caso d'uso in cui vince le alternative offerte da altri standard (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
Qualche idea:
- Le funzioni che assumono varargs, che naturalmente limitano il conteggio degli oggetti a qualcosa di ragionevole, tuttavia non hanno alcun limite superiore utile a livello di API.
- Funzioni ricorsive, dove lo stack sprecato è indesiderabile
- Molte piccole allocazioni e rilasci, in cui l'heap overhead sarebbe male.
- Gestire array multidimensionali (come matrici di dimensioni arbitrarie), in cui le prestazioni sono fondamentali e ci si aspetta che piccole funzioni vengano incorporate molto.
- Dal commento: algoritmo concorrente, in cui l' allocazione dell'heap ha un sovraccarico di sincronizzazione .
Wikipedia ha un esempio che non soddisfa i miei criteri , perché la differenza pratica nell'uso dell'heap sembra irrilevante almeno senza contesto. È anche non ideale, perché senza più contesto, sembra che il conteggio degli oggetti potrebbe causare un overflow dello stack.
Nota: sto specificatamente cercando un codice di esempio o un suggerimento di un algoritmo che ne trarrebbe beneficio, per me stesso per implementare l'esempio.
alloca
, che penso siano sostanzialmente la stessa cosa). Ma quella cosa multithread è buona, modificando la domanda per includerla!
malloc
comportamento di Linux sia conforme allo standard C.
alloca()
sarebbe davvero eclissaremalloc()
in un ambiente multithread a causa della contesa di blocco in quest'ultimo . Ma questo è un vero allungamento poiché i piccoli array dovrebbero usare solo una dimensione fissa e gli array di grandi dimensioni probabilmente avranno comunque bisogno dell'heap.