Dois-je enseigner à mes étudiants alloca? [fermé]

18

Dans quelle mesure est-il largement utilisé allocadans le monde réel? Dois-je enseigner à mes élèves à utiliser allocaquand 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 freemanuellement semble prometteuse, notamment dans les fonctions à points de sortie multiples.

fredoverflow
la source
8
Pourquoi ne pas leur enseigner les VLA C99?
@cnicutar alloca () dépend de l'implémentation mais au moins de nombreuses implémentations renvoient NULL en cas d'échec. Les VLA C99 n'ont aucun moyen d'indiquer une défaillance.
Compliqué voir bio
2
@sbi: Pour SO, c'est une question ouverte qui ne correspond pas vraiment au format de ce que les fermiers pensent que les messages SO devraient être. C'est trop subjectif, il n'y a pas de réponse claire, juste une opinion. Ce qui est bien mais pas pour SO. Notez également que, par respect pour le représentant du PO, personne ne vote contre, nous fermons simplement cette question comme hors sujet.
Paul Sasik
1
@PascalCuoq De toute façon, vous ne devriez pas allouer beaucoup avec alloca / VLA. Si vous ne savez pas ce qu'est "beaucoup" dans le contexte actuel, utilisez malloc.

Réponses:

31

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
La seule utilisation que j'ai vue où il ne serait pas préférable de le faire d'une autre manière était la détection de smash de pile sur certaines versions de Windows, où un échec d'allocation indiquait un espace insuffisant - ou peut-être qu'il y avait juste un ASM noueux pour attraper le crash ; cela fait un moment que je n'ai pas regardé ce code. Cela a fonctionné, mais c'était un peu une horreur.
Donal Fellows
13

Je peux voir deux choses se produire:

  1. Les élèves comprennent l'impact de alloca, lisent les différences entre la pile et le tas et utilisent allocaavec soin. (peu probable)

  2. Les élèves pensent «wow, c'est comme mallocsans se soucier de free», 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:

#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);
} 

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.

BlackJack
la source
1
Je pense que la plupart des étudiants appartiennent toujours à la deuxième catégorie même après leur avoir montré l'exemple de code.
replié à droite
@WTP - Probablement, mais c'est pourquoi vous leur dites de ne pas l'utiliser même après leur avoir montré ce qui peut arriver.
BlackJack
4
Pourquoi ce code utilise-t-il _allocaplutôt que alloca? Et pourquoi jette-t-il le résultat?
Keith Thompson,
5

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

hugomg
la source
2

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 allocaest soit

  1. Inutile, c'est-à-dire qu'il pourrait être trivialement remplacé par des variables de taille fixe de durée de stockage automatique, OU
  2. Un débordement de pile dangereux attend de se produire.

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

R .. GitHub ARRÊTEZ D'AIDER LA GLACE
la source
2
Bien sûr, personne ne pourrait jamais l'utiliser de manière responsable. Non jamais.
DeadMG
La seule utilisation «responsable» de alloc100% est équivalente aux baies automatiques de taille fixe et moins portable.
R .. GitHub STOP HELPING ICE
Je suppose donc que personne ne pourrait jamais vouloir allouer une quantité dynamique, disons, quelques kilo-octets qui ne déborderait jamais. Ou appelez une fonction API du système d'exploitation qui leur dira combien est disponible. Ou augmentez simplement la taille de la pile.
DeadMG
S'il s'agit de quelques Ko et que vous êtes sûr d'en avoir quelques Ko, vous pouvez simplement utiliser T foo[5000];ou autre chose.
R .. GitHub STOP HELPING ICE
Seulement si T a un constructeur par défaut trivial. Si j'avais besoin de performances, même une simple mise à zéro de la mémoire pourrait me coûter cher. Mais d'autres types peuvent avoir une logique de construction par défaut encore plus complexe. Si je voulais, par exemple, créer dynamiquement un tableau de 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.
DeadMG
1

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

MartyTPS
la source
0

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 utilise alloca(), ou alloue de grands tableaux temporaires ou utilise la récursivité au-delà d'une certaine profondeur dépendante du contexte.

user117529
la source