Wie weit verbreitet ist alloca
die reale Welt? Soll ich meinen Schülern das Verwenden beibringen, alloca
wenn es Sinn macht? Oder sollte ich ihnen beibringen, es niemals zu benutzen? Ausgehend von einem C ++ RAII-Hintergrund free
klingt die Idee, nicht manuell aufrufen zu müssen, vielversprechend, insbesondere bei Funktionen mit mehreren Ausstiegspunkten.
18
malloc
.Antworten:
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.
quelle
Ich kann zwei Dinge sehen:
Die Schüler verstehen die Auswirkungen von
alloca
, lesen über die Unterschiede zwischen Stapel und Haufen und verwenden siealloca
sorgfältig. (unwahrscheinlich)Die Schüler denken, "Wow, das ist so, als ob sie sich
malloc
keine Gedanken über das machenfree
", 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: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.
quelle
_alloca
eher verwendet alsalloca
? Und warum wirft es das Ergebnis?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 ...)
quelle
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
alloca
ist entwederAbgesehen 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).quelle
alloc
ist 100% gleichbedeutend mit automatischen Arrays fester Größe und weniger portabel.T foo[5000];
oder was auch immer.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.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.
quelle
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 Projektalloca()
große temporäre Arrays verwendet oder zuweist oder eine Rekursion ab einer bestimmten kontextabhängigen Tiefe verwendet.quelle