Welchen Vorteil hat es, eine Variable nicht initialisiert zu lassen?

8

In vielen Sprachen dürfen Sie eine Variable deklarieren und vor der Initialisierung verwenden.

In C ++ können Sie z. B. ein Snippet schreiben:

%Vor%

Das würde natürlich unberechenbar zurückkommen (na ja, außer Sie wüssten, wie Ihr Programm Speicher abbildet), aber meine Frage ist, warum ist dieses Verhalten von Compilern erlaubt?

Gibt es eine Anwendung oder Effizienz, die sich aus der Verwendung nicht initialisierten Speichers ergibt?

edit : Es ist mir aufgefallen, dass das Verlassen der Initialisierung für den Benutzer Schreibvorgänge für Speichermedien minimiert, die eine begrenzte Lebensdauer haben (Schreibzyklen). Nur ein konkretes Beispiel unter der oben genannten Überschrift "Leistung". Danke.

    
ozmo 09.08.2010, 02:00
quelle

8 Antworten

13

Meine Gedanken (und ich habe mich vorher geirrt, frag einfach meine Frau) sind, dass es einfach ein Überbleibsel von früheren Inkarnationen der Sprache ist.

Frühere Versionen von C erlaubten dir nicht, Variablen irgendwo in einer Funktion zu deklarieren, sie mussten ganz oben sein (oder vielleicht zu Beginn eines Blocks, es ist schwer, sich daran zu erinnern, seit ich tue das heutzutage selten).

Außerdem haben Sie den verständlichen Wunsch, eine Variable nur dann zu setzen, wenn Sie wissen, was sie sein soll. Es macht keinen Sinn, eine Variable auf etwas zu initialisieren, wenn das nächste, was Sie damit tun, einfach diesen Wert überschreibt (da kommen die Performance-Leute von hier her).

Aus diesem Grund ist es notwendig, nicht initialisierte Variablen zuzulassen, obwohl Sie nicht verwenden sollten , bevor Sie sie initialisieren, und die guten Compiler haben Warnungen, um Sie darüber zu informieren .

In C ++ (und späteren Versionen von C), wo Sie Ihre Variable irgendwo in einer Funktion erstellen können, sollten Sie sie wirklich erstellen und gleichzeitig initialisieren. Aber das war früh nicht möglich. Du musst etwas wie:

verwenden %Vor%

Heutzutage würde ich wählen:

%Vor%     
paxdiablo 09.08.2010 02:19
quelle
4

Einige APIs sind so konzipiert, dass sie Daten über übergebene Variablen zurückgeben, z. B .:

%Vor%

Es kann den Wert von 'ok' in der Funktion setzen, daher ist es eine Verschwendung, es zu initialisieren.

(Ich befürworte diesen API-Stil nicht.)

    
sje397 09.08.2010 02:16
quelle
4

Die älteste Entschuldigung in der Programmierung: es verbessert die Leistung!

edit: Lesen Sie Ihre Kommentare und ich stimme zu - vor Jahren lag der Fokus auf der Leistung auf der Anzahl der CPU-Zyklen. Mein erster C-Compiler war das traditionelle C (das vor ANSI C) und erlaubte das Kompilieren aller möglichen Monstrositäten. In diesen modernen Zeiten geht es bei der Performance um die Anzahl der Kundenbeschwerden. Wie ich neuen Absolventen sage, stellen wir ein - "Es ist mir egal, wie schnell das Programm eine falsche Antwort gibt". Nutzen Sie alle Werkzeuge moderner Compiler und Entwicklung, schreiben Sie weniger Bugs und jeder kann pünktlich nach Hause gehen.

    
james 09.08.2010 02:08
quelle
2

Die kurze Antwort ist, dass der Compiler in komplizierteren Fällen möglicherweise nicht feststellen kann, ob eine Variable vor der Initialisierung verwendet wird oder nicht.

zB

%Vor%

Gute Compiler geben eine Warnmeldung aus, wenn sie einen wahrscheinlichen Fehler vor der Initialisierung erkennen können, aber in komplexen Fällen - insbesondere bei mehreren Kompilierungseinheiten - kann der Compiler nichts sagen.

Ob eine Sprache das Konzept nicht initialisierter Variablen erlauben sollte, ist eine andere Frage. C # ist bei der Definition jeder Variablen, die mit einem Standardwert initialisiert wird, etwas ungewöhnlich. Die meisten Sprachen (C ++ / C / BCPL / FORTRAN / Assembler / ...) überlassen es dem Programmierer, ob die Initialisierung geeignet ist. Gute Compiler erkennen manchmal unnötige Initialisierungen und eliminieren sie, aber das ist nicht selbstverständlich. Compiler für obskurere Hardware neigen dazu, weniger Aufwand in die Optimierung zu investieren (was der harte Teil des Compilerschreibens ist), so dass Sprachen, die auf solche Hardware abzielen, keine unnötige Codegenerierung erfordern.

    
MZB 09.08.2010 02:56
quelle
1

Vielleicht ist es in einigen Fällen schneller, den Speicher nicht initialisiert zu lassen, bis er benötigt wird (z. B. wenn Sie von einer Funktion zurückkehren, bevor Sie eine Variable verwenden). Normalerweise initialisiere ich sowieso alles, ich bezweifle, dass es in der Leistung wirklich anders ist. Der Compiler wird seine eigene Methode haben, nutzlose Initialisierungen zu optimieren, da bin ich mir sicher.

    
dreamlax 09.08.2010 02:08
quelle
1

Einige Sprachen haben Standardwerte für einige Variablentypen. Davon abgesehen, bezweifle ich, dass es in irgendeiner Sprache Leistungsvorteile gibt, diese nicht explizit zu initialisieren. Die Nachteile sind jedoch:

  • Die Möglichkeit, dass es initialisiert werden muss und ohne getan zu werden riskiert einen Absturz
  • unerwartete Werte
  • Mangel an Klarheit und Zweck für andere Programmierer

Mein Vorschlag ist immer initialisieren Sie Ihre Variablen und die Konsistenz wird sich auszahlen.

    
N8g 09.08.2010 02:10
quelle
0

Abhängig von der Größe der Variablen kann der Wert als nicht initialisiert im Namen der Leistung als Mikrooptimierung betrachtet werden. Relativ wenige Programme (im Vergleich zu einer breiten Palette von Software-Typen) würden durch die zusätzlichen zwei oder drei Zyklen, die notwendig sind, um ein Doppel zu laden, negativ beeinflusst werden; Unter der Annahme, dass die Variable ziemlich groß ist, ist es wahrscheinlich eine gute Idee, die Initialisierung zu verzögern, bis die Initialisierung vollständig klar ist.

    
kbrimington 09.08.2010 03:27
quelle
0

für den Schleifenstil

%Vor%

und Sie möchten, dass die for-Schleife wie for(init;condition;inc)

aussieht

hier ist einer mit einer absoluten Notwendigkeit

%Vor%

horizontaler Bildschirm Immobilien mit langen verschachtelten Namen

hat länger Gültigkeit für die Debugging-Sichtbarkeit

sehr gelegentlich Leistung

    
nbourbaki 09.08.2010 04:59
quelle