Beeinflussen mehrere Deklarationen desselben Typs die Kompilierzeit?

7

Ich habe mich gefragt, ob das Deklarieren mehrerer Dinge desselben Typs die Kompilierungszeit beeinflusst, wie unten.

%Vor%

vs

%Vor%     
Jonascone 25.06.2013, 11:38
quelle

9 Antworten

6

Diese Antwort beschreibt, warum der vorgeschlagene Code wenig zur Kompilierungszeit beiträgt, auf die sich derzeit keine der anderen Antworten bezieht.

Typischerweise besteht ein Teil der Grundstruktur eines modernen Compilers aus:

  • Es gibt einen Teil, der jedes Zeichen liest, die Zeichen mit einfachen Mustern (wie "eine Folge von Buchstaben und Zahlen beginnend mit einem Buchstaben" oder "+" oder "/ * text * /") vergleicht und diese in einfügt Token mit zusätzlichen Daten (Bezeichner mit Text für Name, Operator vom Typ +, Leerraum) Dieser Teil wird als lexikalischer Analysator bezeichnet.
  • Es gibt einen Teil, der die Token empfängt und ihre syntaktische Struktur analysiert.
  • Es gibt andere Teile, die uns hier nicht interessieren.

Der Teil, der die syntaktische Struktur analysiert, sieht ungefähr so ​​aus: Wenn er a() in einer Deklaration wie void a() erkennt, ruft er eine Routine an einem anderen Ort im Compiler auf, der a als Bezeichner mit dem Typ% co_de registriert %. Dies geschieht, wenn function returning void erkannt wird, a() erkannt wird und b() erkannt wird.

Wichtig ist in diesem Fall, dass bei beiden vorgeschlagenen Codefolgen das Gleiche passiert: c() , a() und b() werden alle erkannt und es wird die gleiche Sequenz von Routineaufrufen zur Registrierung dieser Bezeichner durchgeführt. Ab dann ist die Verarbeitung von ihnen identisch. In typischen Compilern gibt es keinen Unterschied in der Art, wie c() , a() und b() behandelt werden.

Dies bedeutet, dass der einzige Unterschied in der Verarbeitung dieser Codefolgen durch den Compiler im lexikalischen Analysator und im Syntaxprozessor besteht. Für eine der Codefolgen gibt es ein paar mehr Zeichen und ein paar mehr Tokens, so dass die Codefolge wahrscheinlich etwas länger dauert. Mit der Geschwindigkeit heutiger Computer ist diese Zeit jedoch winzig.

Es ist möglich, dass geringfügige Unterschiede in der Verarbeitung Kaskadeneffekte haben können, wenn sie Auswirkungen darauf haben, was im Prozessor-Cache gespeichert ist oder welcher Speicher zugewiesen und freigegeben wird. Diese sind jedoch ganz nebensächlich, genauso wie, wenn ein Mechaniker an einem Auto arbeitet und seinen Schraubenschlüssel dabei in ein anderes Regal bewegt, kann das beeinflussen, wie lange es dauert, bis sie am nächsten Auto arbeiten, weil sie es getan haben um zum Regal zu gehen, um den Schraubenschlüssel zu bekommen. Es ist nur zufällig und nicht eine sinnvolle Ursache und Wirkung.

    
Eric Postpischil 25.06.2013, 13:49
quelle
7

Ich wäre überrascht, wenn es überhaupt nicht wäre, da der Compiler anderen Code für die zwei Fälle ausführt, aber es ist unmöglich zu erraten, welcher schneller wäre und ob einer wäre durchweg schneller als der andere.

Ich wäre auch überrascht, wenn es möglich wäre, den Unterschied in irgendeiner sinnvollen Weise zu messen, da es wahrscheinlich niemals eine Frage von mehr als ein paar Mikrosekunden sein würde.

Wenn Sie Probleme mit der Kompilierungszeit haben, ist der Deklarationsstil nicht die Ursache.

    
molbdnilo 25.06.2013 12:00
quelle
6

Nicht nennenswert. Mach dir keine Sorgen.

    
Jeremy Roman 25.06.2013 11:39
quelle
4

Es gibt keinen großen Unterschied in der Kompilierzeit. Aber es ist besser, das zweite zu verwenden, weil es mehr Standard, lesbar und verständlich ist. Ich werde versuchen, diese Antwort mit Verweis auf die Kompilierzeit zu bearbeiten.

    
Rohit Vipin Mathews 25.06.2013 11:52
quelle
2

Warum sollte man für die erste Option gehen?

Beide scheinen die gleiche Zeit für mich zu nehmen, da es eine Erklärung ist. Compiler wird jedes als 3 void nehmen, wenn void einmal dreimal geschrieben wird. Aber ich werde die Kompilierungszeit im Detail betrachten.

Aber im Ernst, ein Programmierer wird sich für die zweite Stelle entscheiden, da er den Code-Code-Standards entspricht, die zur Schönheit des Codes führen.

    
Shumail Mohyuddin 25.06.2013 17:02
quelle
0

Natürlich ist es das Gleiche. Niemand wird die erste Ausgabe schreiben

    
Rainer Liao 25.06.2013 11:54
quelle
0

Frage, die es wert ist zu fragen. Wenn Sie die Angewohnheit haben, zu gehen und zu sehen, wie Ihr Compiler Ihren C ++ - Code tatsächlich in Assembly umwandelt, ist dies leichter zu beantworten: Die beiden Definitionen geben genau den Assembly-Code aus. Zum Beispiel habe ich einen kleinen Test kompiliert (mit Input und Output, um eine konstante Faltungsoptimierung zu vermeiden), und die beiden Versionen geben genau die gleiche binäre (byteweise identische) aus.

%Vor%

Wenn Sie die Disassemblierung sehen, sehen Sie, dass die int-Deklarationen wie folgt kompiliert werden:

%Vor%

Unabhängig von der verwendeten Syntax gibt es nur eine Möglichkeit, Variablenraum auf Assemblerebene zu reservieren. Alle Compiler reservieren lokalen Variablenraum in nur einer Anweisung.

    
lip 25.06.2013 12:38
quelle
0

Beide sind gleich, aber es ist immer gut, die zweite zu verwenden, damit der Code strukturierter, lesbarer und für andere Personen, die nicht Sie sind, leicht verständlich ist. Der erste wird mehr Verwirrung stiften.

    
Kranthi Kumar 25.06.2013 12:42
quelle
0

Einfache Antwort auf eine kurze Frage: Nein.

    
Blacktempel 25.06.2013 12:46
quelle

Tags und Links