Soll ich meinen Schülern Allocation beibringen? [geschlossen]


18

Wie weit verbreitet ist allocadie reale Welt? Soll ich meinen Schülern das Verwenden beibringen, allocawenn es Sinn macht? Oder sollte ich ihnen beibringen, es niemals zu benutzen? Ausgehend von einem C ++ RAII-Hintergrund freeklingt die Idee, nicht manuell aufrufen zu müssen, vielversprechend, insbesondere bei Funktionen mit mehreren Ausstiegspunkten.



8
Warum nicht ihnen C99 VLAs beibringen?

@cnicutar alloca () ist implementierungsabhängig, aber mindestens viele Implementierungen geben bei einem Fehler NULL zurück. C99-VLAs können keinen Fehler anzeigen.
Kompliziert siehe Bio

2
@sbi: Für SO ist dies eine offene Frage, die nicht wirklich dem Format entspricht, wie die Closer denken, dass SO-Posts sein sollten. Es ist zu subjektiv, es gibt keine eindeutige Antwort, nur eine Meinung. Welches ist in Ordnung, aber nicht für SO. Beachten Sie auch, dass aus Respekt vor dem Repräsentanten des OP niemand abstimmt. Wir schließen diese Frage nur als "Off Topic" ab.
Paul Sasik

1
@PascalCuoq Mit alloca / VLAs sollten Sie sowieso nicht viel zuordnen. Wenn Sie nicht sicher sind, was "viel" im aktuellen Kontext ist, verwenden Sie malloc.

Antworten:


31

Wenn Sie einen Kurs in allgemeiner C-Programmierung halten, sollten Sie ihnen nichts beibringen, was nicht im Standard enthalten ist. Anfängerprogrammierer müssen unnötigerweise nicht-standardmäßigen und / oder nicht-portierbaren Code schreiben, da sie auf diese Weise unterrichtet wurden. Dies war in den letzten 20 bis 30 Jahren ein großes Problem für die Softwareindustrie. Die Kosten dafür, ihnen nicht den Standard und nichts als den Standard beizubringen, sind wahrscheinlich astronomisch.

Wenn Sie einen fortgeschrittenen Kurs in Algorithmen oder Anwendungsprogrammierung halten, ist es möglicherweise sinnvoll, ihn zu erwähnen. Andererseits habe ich 15 Jahre lang alles programmiert, von Echtzeit-Embedded-Apps bis hin zu Windows-Anwendungsflusen, ohne diese Funktion jemals zu verwenden.


Die einzige Verwendung, die ich je gesehen habe, wo es anders nicht besser gemacht werden könnte, war die Stack-Smash-Erkennung bei einigen Windows-Versionen, bei denen ein Fehler darauf hinwies, dass nicht genügend Speicherplatz vorhanden war - oder vielleicht nur eine knorrige ASM, um den Absturz aufzufangen ; Es ist schon eine Weile her, dass ich mir diesen Code angesehen habe. Es hat funktioniert, war aber ein bisschen schrecklich.
Donal Fellows

13

Ich kann zwei Dinge sehen:

  1. Die Schüler verstehen die Auswirkungen von alloca, lesen über die Unterschiede zwischen Stapel und Haufen und verwenden sie allocasorgfältig. (unwahrscheinlich)

  2. Die Schüler denken, "Wow, das ist so, als ob sie sich mallockeine Gedanken über das machen free", verwenden es übermäßig, bekommen einen Stapelüberlauf und haben keine Ahnung, was los ist.

Ich denke, es ist viel besser, wenn Sie beschreiben alloca, dann führen Sie diesen Code aus:

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

Quelle: http://www.strchr.com/alloca

Zeigen Sie ihnen die Gefahren und bitten Sie sie, sie nicht zu benutzen. Sie werden immer noch etwas über Stapel vs.


1
Ich denke, die meisten Schüler fallen immer noch in die zweite Kategorie, obwohl sie den Beispielcode gezeigt haben.
Rightfold

@WTP - Wahrscheinlich, aber deswegen sagst du ihnen, sie sollen es nicht benutzen, obwohl sie ihnen gezeigt haben, was passieren kann.
Blackjack

4
Warum wird dieser Code _allocaeher verwendet als alloca? Und warum wirft es das Ergebnis?
Keith Thompson

5

Die Antwort auf diese Frage sollte in erster Linie auf Ihren Zielen basieren .

Möchten Sie jemandem beibringen, der bereits programmieren kann, wie man C schreibt und in freier Wildbahn mit vorhandenem C-Code arbeitet? Wenn ja, erzähle etwas über alloca und alles andere, was du willst.

Wenn Sie andererseits einen Einführungskurs unterrichten, in dem C nur zufällig verwendet wird (und weil C eine sehr kleine Sprache ist usw.), sollten Sie sich auf die wichtigen Teile konzentrieren (Schreiben von modularen Programmen, Unterprogrammen, Sammlungen usw.). .). Aus Sicht eines Schülers ist alloca eine Bir-Redundanz, da malloc in den meisten Fällen ausreicht. Aus Sicht eines guten Codes sollten Sie explizit erwähnen, wie die manuelle Speicherverwaltung ärgerlich ist und wie andere Sprachen mit diesem Problem umgehen. Schließlich gibt es noch mehr Dinge, die der Speicherverwaltung zuzuordnen sind, also sollten Sie sich wirklich nicht auf diese beschränken, und wie Sie bereits erwähnt haben, ist es viel einfacher, den Zweck der Zuweisung zu verstehen, wenn Sie sie mit anderen "normaleren" Methoden vergleichen, um Dinge in anderen Sprachen zu erledigen (oder C99 ...)


2

Nein.

Der einzige Grund, warum ein C-Programmierer sich der Existenz von Allocation bewusst sein sollte, ist das Verstehen und Korrigieren von Legacy-Code, der es verwendet.

Jede Verwendung von allocaist entweder

  1. Nutzlos, dh es könnte trivialerweise durch Variablen fester Größe mit automatischer Speicherdauer OR ersetzt werden
  2. Ein gefährlicher Stapelüberlauf wartet darauf.

Abgesehen von ein paar Gedankenexperimenten, für die ich noch nie Beispiele aus der Praxis gefunden habe, gibt es keinen Anwendungsfall für alloca(oder VLAs), die weder nutzlos noch anfällig sind (einer der beiden oben genannten Fälle).


2
Natürlich kann absolut niemand verantwortungsbewusst damit umgehen. Nein niemals.
DeadMG

Die einzige "verantwortungsbewusste" Verwendung von allocist 100% gleichbedeutend mit automatischen Arrays fester Größe und weniger portabel.
R ..

Ich vermute also, dass niemand jemals eine dynamische Menge zuweisen möchte, zum Beispiel ein paar Kilobyte, die niemals überlaufen würden. Oder rufen Sie eine OS-API-Funktion auf, die angibt, wie viel verfügbar ist. Oder erhöhen Sie einfach die Stapelgröße um ein Vielfaches.
DeadMG

Wenn es ein paar KB sind und Sie sicher sind, dass Sie ein paar KB haben, können Sie einfach verwenden T foo[5000];oder was auch immer.
R ..

Nur wenn T einen einfachen Standardkonstruktor hat. Wenn ich leistungsbedürftig wäre, könnte mich sogar das einfache Nullsetzen des Speichers kosten. Andere Typen können jedoch eine noch komplexere Standardkonstruktionslogik aufweisen. Wenn ich zum Beispiel ein Array von dynamisch erstellen möchte std::mutex, kann ich einen Kernel-Aufruf und eine Kontextumschaltung für fünftausend Mutexe aufrufen. Nicht billig. Ganz zu schweigen von den zusätzlichen Cache-Kosten für das Platzieren lokaler Variablen nach dem Array.
DeadMG

1

Meiner Meinung nach ist es nicht empfehlenswert, es zu verwenden, es sei denn, Sie unterrichten Low-Level-Compiler-Prinzipien, die zum Zuweisen von Stapelspeicherplatz für lokale Variablen verwendet werden. Lehre es in diesem Zusammenhang.


0

Die GCC-Dokumentation hat einige praktische Vor- und Nachteile alloca(). Aus praktischer Sicht wird es von einer anständigen Menge freier Software verwendet, daher ist es gut zu verstehen, wie es funktioniert und wo es in vorhandenem Code verwendet wird.

Durch die Übergabe der -Wl,-stack=neuen Stapelgröße an gcc wird die maximale Stapelgröße erhöht. Sie müssen dies tun, wenn Ihr Projekt alloca()große temporäre Arrays verwendet oder zuweist oder eine Rekursion ab einer bestimmten kontextabhängigen Tiefe verwendet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.