web-dev-qa-db-fra.com

Devrais-je enseigner à mes étudiants alloca?

Quelle est la largement utilisée est alloca dans le monde réel? Devrais-je apprendre à mes étudiants à utiliser alloca quand il est logique? Ou devrais-je leur apprendre de ne jamais l'utiliser? Venant d'un fond C++ Raii, l'idée de ne pas avoir à appeler free sonne manuellement prometteuse, en particulier dans les fonctions avec plusieurs points de sortie.

18
fredoverflow

Si vous tenez un cours dans la programmation générale C, vous ne devriez pas leur apprendre ne chose qui n'est pas dans la norme. Les programmeurs débutants écrivent inutilement le code non standard et/ou non portable car ils ont été enseignés de cette façon, a été un problème énorme pour l'industrie du logiciel au cours des 20 à 30 dernières années environ. Le coût de ne pas leur apprendre la norme et rien que la norme est probablement astronomique.

Si vous tenez un cours plus avancé dans les algorithmes ou la programmation d'applications, cela pourrait être bon de le mentionner. D'autre part, j'ai tout programmé des applications intégrées de durs en temps réel vers Windows Application Fluff pendant 15 ans sans jamais utiliser cette fonction.

31
user29079

Je peux voir deux choses qui se passent:

  1. Les élèves comprennent l'impact de alloca, lisez sur les différences entre la pile et le tas et l'utilisation alloca soigneusement. (improbable)

  2. Les élèves pensent "WOW, c'est comme malloc sans se soucier de la free", utilisez-le excessivement, obtenez le débordement de la pile et ne savez pas quoi de neuf.

Je pense que c'est bien 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 vont toujours en savoir plus sur Stack vs. Heap, voir les périls en action et passer à autre chose avec des trucs standard.

13
BlackJack

La réponse à cette question devrait être basée sur quels sont vos objectifs en premier lieu.

Voulez-vous enseigner à quelqu'un qui sait déjà comment rédiger comment écrire C et travailler avec le code C existant dans la nature? Si oui, racontez-vous à propos d'Alloca et de tout ce que vous voulez.

D'autre part, si vous enseignez un cours d'introduction qui n'utilise que C par coïncidence (et parce que c est une très petite langue, etc.), vous devez vous concentrer sur les parties importantes (écrire des programmes modulaires, les sous-routines, les collections .. .). Du point de vue d'un élève, ALLOCA est un bir redondant puisque MALLOC est suffisant dans la plupart des cas et dans une perspective de bonne code, vous ferez mieux de mentionner explicitement comment la gestion de la mémoire manuelle est gênante et comment autre Les langues traitent de ce problème après tout, il y a plus de choses à la gestion de la mémoire puis ALLOCA ou RAII afin que vous ne devriez pas vraiment vous limiter à ceux-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 moyens "plus standard" de faire des choses dans d'autres langues (ou C99 ...)

5
hugomg

Non.

La seule raison pour laquelle un programmeur C devrait même être au courant de l'existence d'Alloca est de comprendre et de corriger le code hérité qui l'utilise.

Toute utilisation de alloca est soit

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

En plus de quelques expériences de pensée pour lesquelles je n'ai jamais trouvé d'exemples du monde réel, il n'y a pas de cas d'utilisation pour alloca (ou VLA) qui n'est pas inutile ou vulnérable (l'un des 2 cas ci-dessus).

Mon opinion n'est pas encouragée à l'utiliser, à moins que vous enseignez des principes de compilateur de niveau bas utilisé pour allouer de l'espace de pile pour les variables locales. Apprenez-le dans ce contexte.

1
MartyTPS

La Documentation GCC a quelques avantages et inconvénients pratiques sur alloca(). D'une perspective pratique, une quantité décente de logiciels libres l'utilise, il est donc bon de comprendre comment cela fonctionne et où il est utilisé dans le code existant.

Passer -Wl,-stack= NOUVELLE-STACK-TAILLE à GCC augmente la taille maximale de la pile; Vous aurez besoin de cela si votre projet utilise alloca() ou alloue de grandes matrices temporaires ou utilise la récursivité après une certaine profondeur dépendante du contexte.

0
user117529