Dans quelle mesure est-il largement utilisé alloca
dans le monde réel? Dois-je enseigner à mes élèves à utiliser alloca
quand cela a du sens? Ou devrais-je leur apprendre à ne jamais l'utiliser? Issu d'un background C ++ RAII, l'idée de ne pas avoir à appeler free
manuellement semble prometteuse, notamment dans les fonctions à points de sortie multiples.
18
malloc
.Réponses:
Si vous tenez un cours de programmation générale en C, vous ne devriez pas leur enseigner une chose qui n'est pas dans la norme. Les programmeurs débutants écrivant inutilement du code non standard et / ou non portable parce qu'ils ont été enseignés de cette façon, a été un énorme problème pour l'industrie du logiciel au cours des 20-30 dernières années. Le coût de ne pas leur enseigner la norme et rien d'autre que la norme est probablement astronomique.
Si vous tenez un cours plus avancé sur les algorithmes ou la programmation d'applications, il pourrait être bon de le mentionner. D'un autre côté, j'ai tout programmé, des applications embarquées en temps réel difficiles aux applications Windows pendant 15 ans sans jamais utiliser cette fonction.
la source
Je peux voir deux choses se produire:
Les élèves comprennent l'impact de
alloca
, lisent les différences entre la pile et le tas et utilisentalloca
avec soin. (peu probable)Les élèves pensent «wow, c'est comme
malloc
sans se soucier defree
», utilisez-le de manière excessive, obtenez un débordement de pile et ne savez pas ce qui se passe.Je pense que c'est beaucoup mieux si vous décrivez
alloca
, puis exécutez ce code:Source: http://www.strchr.com/alloca
montrez-leur les dangers, puis dites-leur de ne pas l'utiliser. Ils en apprendront toujours plus sur la pile contre le tas, verront les dangers en action et pourront continuer avec des choses standard.
la source
_alloca
plutôt quealloca
? Et pourquoi jette-t-il le résultat?La réponse à cette question doit être basée sur vos objectifs en premier lieu.
Voulez-vous enseigner à quelqu'un qui sait déjà programmer comment écrire C et travailler avec le code C existant dans la nature? Si oui, parlez d'alloca et de tout ce que vous voulez.
D'un autre côté, si vous enseignez un cours d'introduction qui utilise uniquement le C par hasard (et parce que le C est un très petit langage, etc.), vous devez vous concentrer sur les parties importantes (écriture de programmes modulaires, sous-programmes, collections, .. .). Du point de vue d'un étudiant, alloca est un bir redondant puisque malloc est suffisant dans la plupart des cas et d'un point de vue de bon code, vous feriez mieux de mentionner explicitement comment la gestion manuelle de la mémoire est ennuyeuse et comment les autres langues traitent ce problème Après tout, il y a plus les choses à la gestion de la mémoire puis alloca ou RAII donc vous ne devriez vraiment pas vous limiter à celles-ci et comme vous l'avez déjà mentionné, il est beaucoup plus facile de comprendre le but de alloca si vous le comparez à d'autres façons "plus standard" de faire les choses dans d'autres langues (ou C99 ...)
la source
Non.
La seule raison pour laquelle un programmeur C devrait même être conscient de l'existence d'alloca est de comprendre et de corriger le code hérité qui l'utilise.
Toute utilisation de
alloca
est soitMis à part quelques expériences de réflexion pour lesquelles je n'ai jamais trouvé d'exemples réels, il n'y a aucun cas d'utilisation pour
alloca
(ou VLA) qui n'est ni inutile ni vulnérable (l'un des 2 cas ci-dessus).la source
alloc
100% est équivalente aux baies automatiques de taille fixe et moins portable.T foo[5000];
ou autre chose.std::mutex
, je pourrais invoquer un appel de noyau et un changement de contexte pour cinq mille mutex. Pas cher. Sans parler du coût supplémentaire du cache pour placer des variables locales après le tableau.À mon avis, n'encouragez pas son utilisation à moins que vous n'enseigniez les principes de compilation de bas niveau utilisés pour allouer l'espace de pile aux variables locales. Enseignez-le dans ce contexte.
la source
La documentation du CCG présente quelques avantages et inconvénients pratiques
alloca()
. D'un point de vue pratique, une quantité décente de logiciels libres l'utilise, il est donc bon de comprendre comment il fonctionne et où il est utilisé dans le code existant.Passer
-Wl,-stack=
new-stack-size à gcc augmente la taille maximale de la pile; vous devrez le faire si votre projet utilisealloca()
, ou alloue de grands tableaux temporaires ou utilise la récursivité au-delà d'une certaine profondeur dépendante du contexte.la source