Cette question a plutôt été gelée à SO, j'ai donc décidé de la supprimer ici et d'essayer ici à la place. Si vous pensez que cela ne convient pas non plus, veuillez au moins laisser un commentaire sur la suggestion pour trouver un exemple que je recherche ...
Pouvez-vous donner un exemple , où l'utilisation des VLA C99 offre un réel avantage sur quelque chose comme les mécanismes C ++ RAII standard utilisant des segments de mémoire?
L'exemple que je recherche devrait:
- Obtenez un avantage de performance facilement mesurable (10% peut-être) par rapport à l'utilisation du tas.
- Ne pas avoir une bonne solution de contournement, qui n'aurait pas besoin du tout du tableau.
- Bénéficiez réellement de l'utilisation de la taille dynamique, au lieu d'une taille maximale fixe.
- Il est peu probable de provoquer un débordement de pile dans un scénario d'utilisation normale.
- Soyez suffisamment fort pour tenter un développeur ayant besoin des performances d'inclure un fichier source C99 dans un projet C ++.
Ajout de quelques précisions sur le contexte: je veux dire VLA tel que signifié par C99 et non inclus dans la norme C ++: int array[n]
où n
est une variable. Et je suis après un exemple de cas d'utilisation où il l'emporte sur les alternatives proposées par d'autres normes (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
Quelques idées:
- Fonctions prenant des varargs, ce qui limite naturellement le nombre d'éléments à quelque chose de raisonnable, mais sans limite supérieure utile au niveau de l'API.
- Fonctions récursives, où la pile perdue n'est pas souhaitable
- Beaucoup de petites allocations et versions, où les frais généraux du tas seraient mauvais.
- Manipuler des tableaux multidimensionnels (comme des matrices de taille arbitraire), où les performances sont critiques et où les petites fonctions devraient beaucoup s'aligner.
- Extrait du commentaire: algorithme simultané, où l' allocation de segment a une surcharge de synchronisation .
Wikipédia a un exemple qui ne répond pas à mes critères , car la différence pratique avec l'utilisation du tas semble hors de propos, du moins sans contexte. Il n'est pas non plus idéal, car sans plus de contexte, il semble que le nombre d'éléments pourrait très bien provoquer un débordement de pile.
Remarque: je suis spécifiquement après un exemple de code, ou la suggestion d'un algorithme qui en bénéficierait, pour moi d'implémenter l'exemple moi-même.
alloca
, qui je pense sont fondamentalement la même chose). Mais cette chose multithread est bonne, question d'édition pour l'inclure!
malloc
comportement de Linux est conforme à la norme C.
alloca()
pourrait peut - être vraiment éclipsermalloc()
dans un environnement multithread en raison de la contention de verrouillage dans ce dernier . Mais c'est un véritable tronçon car les petits tableaux doivent simplement utiliser une taille fixe, et les grands tableaux auront probablement besoin du tas de toute façon.