Ist es eine gute Idee, C99 VLA im Vergleich zu malloc/free?
Ist es eine gute Idee, mit C99-VLA? Wann ist es angebracht, VLA im Vergleich zu malloc/free? (da VLA kann blow up stack?)
- Vermeiden Sie ungeklärte TLAs wie VLAs...
- Der Begriff "VLA" ist eine gut etablierte, namhafte Bedeutung im Kontext von C99. Jemand die Frage beantworten kann, wird wissen, was das bedeutet.
- Mögliche Duplikate von: stackoverflow.com/questions/2034712/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, außer in Fällen, in denen Sie wissen, dass Ihr Stapel sprengen können. Sie können auch ändern Sie die Größe des Stapels, wenn nötig, anders ist es, wie auf jedem OS, aber es ist möglich.
Die Vorteile des VLA sind:
Schnell : die Anpassung der stack-pointer und/oder den frame-pointer hätte man sowieso nicht so die Kosten für ein VLA ist fast 0.
Einfach : eine einfache definition, keine Zeiger zu initialisieren, zu überprüfen, um kostenlos und ohne Risiko von memory leaks.
Wird es automatisch thread-sicher, da jeder thread hat seinen eigenen stack. Es hat auch die bessere Skalierung als gibt es keine Notwendigkeit zu sperren, ein problem, das entstehen kann, wenn mit
malloc/free
.Lesbar : es ist wirklich ein einfaches Konzept, so dass es weniger wahrscheinlich vorstellen, subtile bugs.
Es hat einige Nachteile:
Größe beschränkt : wie bereits gesagt, wird der Stapel in die Luft sprengen könnten.
Buffer overflows sind ein bisschen ernster, als auf heap-Speicher (kann man argumentieren, dass es ist ein Vorteil, als ein Absturz der Anwendung besser ist als eine leise Beschädigung von Daten und schließlich Absturz auf nicht Verwandte Anleitungen).
Portabilität : nicht alle Compiler umzusetzen, aber es kann oft simuliert werden, indem
alloca
(Achtung das semantische ist ein wenig anders, aber nichts wirklich ernstes).alloca()
(+1) Sie können nicht verwendensizeof
, die oft versteckt in Makros.Der primäre Vorteil der stack-Allokation ist, dass Sie automatic memory management der zugewiesenen variable-length-array. Da der Speicher-management ist eine der zentralen Herausforderungen für jedes C-Programm, sollten Sie auf jeden Fall nutzen VLA vereinfachen Ihre Aufgabe, wenn Sie können.
Werde ich dann dafür plädieren, dass Sie verwenden sollten, VLA ' s consistenly, wenn Sie können, und andernfalls verwenden Sie malloc nur, wenn: Sie die Kontrolle über die Dauer der Speicherung, und wenn Sie haben sehr große Zuweisungen und wenn Sie behandeln möchten, out-of-memory-Fehler anmutig.
C++ nicht unterstützt VLAs. Es wird also etwas mehr Aufwand zur Portierung des Codes von C++, sollte die Notwendigkeit entstehen.
Dann wieder, einige glauben, dass dies ist eigentlich eine gute Sache und listig schlagen "Klasse" als ein wunderbarer name für ein symbol in c 🙂
some believe this is actually a good thing and cunningly propose "class" as a wonderful name for a symbol in c :-)
: Gut, wenn man nicht besser sein, der beste Weg, um zu gewinnen, um zu versuchen, um die sabotage der Konkurrenz...Für eine gute Liste der C99-Verwandte links (einschließlich links zu Informationen über variable-length arrays) finden Sie unter:
Xcode ist nun standardmäßig zu verwenden C99 - so was ist C99?
http://lists.apple.com/archives/xcode-users/2008/May/msg00665.html
Nur das hinzufügen weiterer Aspekt (nicht eine direkte Antwort, da keine malloc/free mit einbezogen, aber noch verbunden):
Es ist also nicht nur wegen Portierung, aber ein Allgemeines Kompatibilitätsproblem...
Falls Sie eines benötigen-Kompatibilität, die Sie brauchen, zu überspringen, VLA.