Frage an #define-Experten - Seite 3

 
Alexandr Andreev:


Jeder scheint zu verstehen.....

Dies ist also für diejenigen, die gerade ihren Weg beginnen....

Wir können alles in eine stat-Klasse verpacken und einen Verweis zurückgeben, der dann den Rest ausgleicht, da diese Methode ein Minus hat, wenn sie mit if (a!=5) Print(a) arbeitet; es wird nicht funktionieren, man sollte immer schreiben if (a!=5) {Print(a);}, in Klassen können wir diesen Moment korrigieren, aber ich bin zu faul)) und im Allgemeinen scheint es alles in der Geschichte Archive

den Weg mit Klassen, initialisieren unsere Daten über statische Methode und kombinieren den Operator-Aufruf unsere print.... dannwenn (a!=5) Print(a); , funktioniert es

Das ist alles aus Faulheit. Ich habe mich hinreißen lassen, aber ich habe aufgegeben. Neben den Ausdrucken ist das Schreiben in eine Datei entweder das Sammeln von Daten oder das Ausarbeiten des Algorithmus, die Einstellung. Und wenn Sie vorgegebene Zacken in den Druck ritzen, werden Kommas gedruckt. Alles in allem trainiert es natürlich das Gehirn, aber es zeigt nicht einmal den Weg.

 
Alexandr Andreev:



Dmitry Fedoseev:


Vladimir Simakov:


Darf ich Ihnen zufällig eine Frage stellen? Wie unterscheidet sich ein define von einem Funktionsaufruf für den Compiler? Ich bin zu dem Schluss gekommen, dass dies nicht der Fall ist. Irre ich mich?

 
Valeriy Yastremskiy:

Darf ich Ihnen zufällig eine Frage stellen? Was ist der Unterschied zwischen einem Define und einem Funktionsaufruf für den Compiler? Ich bin zu dem Schluss gekommen, dass dies nicht der Fall ist. Irre ich mich?

Define ist eine Substitution während VOR der Kompilierung, so dass __LINE__ genau so wird, wie es sein sollte, Sie können ein unvollständiges Codefragment ersetzen.

Und Funktion ist in vielen Sprachen Code-Referenz (goto) und in anderen Code-Substitution (Entfaltung aller Funktionen) zur Laufzeit.

Und defy ist irgendwie böse, weil es die Fehlersuche erschwert, also ist es gut, wenn defy nicht da ist.
 
Alexandr Andreev:

Definieren - Substitution zur Kompilierzeit, damit __LINE__ genau so wird, wie es sein soll, können Sie unvollständige Codeschnipsel ersetzen

Und Funktion ist in vielen Sprachen Code-Referenz (goto) und in anderen Code-Substitution (Entfaltung aller Funktionen) zur Laufzeit.

Frage zu MKL. Wenn ich richtig verstanden habe, gibt es in der ausführbaren Datei kein goto, außer bei Schleifen. Die Frage ergab sich aus den Besonderheiten der Kompilierung. Streng von oben nach unten. Und wenn eine Variable am Ende des Schleifenkörpers deklariert und in den Schleifenbedingungen aufgerufen wird, gibt es eine Warnung. Die Ausgabe wird von oben nach unten geprüft. Und die ausführbare Datei wird durch das Ersetzen von Funktionen als Defines erzeugt, nicht durchgoto-Referenzen.

 
Alexandr Andreev:

Definieren - Substitution zur Kompilierzeit, damit __LINE__ genau so wird, wie es sein soll, können Sie unvollständige Codeschnipsel ersetzen

In vielen Sprachen ist eine Funktion ein Verweis auf den Code (goto), während in anderen Sprachen der Code zur Laufzeit ersetzt wird (Entfaltung aller Funktionen).

Die Substitution wirkt sich also nur auf die Geschwindigkeit beim Kompilieren aus?
Ist sie nur für große Bauprojekte sinnvoll?
Oder wird der unbrauchbare Code in der ausführbaren Datei schneller ausgeführt?

 
Valeriy Yastremskiy:

Die Frage bezieht sich auf die MKL. Wenn ich richtig verstanden habe, gibt es in der ausführbaren Datei kein goto, außer bei Schleifen. Die Frage ergab sich aus den Besonderheiten der Kompilierung. Streng von oben nach unten. Und wenn eine Variable am Ende des Schleifenkörpers deklariert wird und in den Schleifenbedingungen aufgerufen wird, wird eine Warnung ausgegeben. Die Ausgabe wird von oben nach unten geprüft. Und die ausführbare Datei wird durch das Ersetzen von Funktionen als Defines erzeugt, nicht durchgoto-Referenzen.

Nein, mcl hat im Jahr 2008 definitiv die Code-Referenzmethode verwendet.

Es ist nicht klar, ob die vollständige Abrollung jetzt verwendet wird.

Heutzutage ist das Schreiben eines eigenen Compilers in jedem Informatik-Fachbereich 3-4 Jahre lang möglich,

Dort kann alles etwas komplizierter sein - es gibt Verweise und Entfaltungen, so dass man seinen Code schreiben kann, wie man will.

Höchstwahrscheinlich geben sie alles preis, was sie können, aber nicht alles. Es ist klar, dass Operatoren wie for usw. eine ganz andere Geschichte sind.

 
Roman:

Die Substitution wirkt sich also nur auf die Kompiliergeschwindigkeit aus?
Ist sie nur für große Bauprojekte sinnvoll?
Oder wird der fehlerhafte Code in der ausführbaren Datei trotzdem schneller ausgeführt?

Die Bereitstellung der üblichen Funktionen ist an sich

d.h. zum Beispiel for (int i=0; i<ArraiSize(max); i++)

hier wird ArraiSize(max); erweitert und erhält so etwas wie die Adresse der Größe des gegebenen Arrays (wenn wir das Array betrachten, hat es seine Größe in einer Variablen, und hier erhalten wir die Substitution für diese Variable "Adresse im Speicher"), d.h. es macht überhaupt keinen Sinn, sie in eine Variable zu ändern

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<size; i++)

In diesem Fall haben ArraiSize(max) und size das gleiche Timing für die Bestimmung des Array-Größenwertes

 
Alexandr Andreev:

Nein, μl hat 2008 definitiv die Code-Referenzmethode verwendet.

Es ist nicht klar, ob die vollständige Abrollung jetzt verwendet wird.

Heutzutage gehört das Schreiben eines eigenen Compilers zum 3. bis 4. Jahr eines jeden Informatikstudiums,

Dort kann alles etwas komplizierter sein - es gibt Verweise und Entfaltungen, so dass man seinen Code schreiben kann, wie man will.

Höchstwahrscheinlich geben sie alles preis, was sie können, aber nicht alles. Es ist klar, dass Operatoren wie for usw. eine völlig andere Geschichte sind.

Ich danke Ihnen. Nach dem laufenden Thema Fehler und Bugs zu urteilen, ist die Optimierung alles.... naja, eine Art von Übel, das zu der light)))) ewigen Reparatur führt, wenn das Auto auch diesen Weg geht)

 
Roman:

Die Substitution wirkt sich also nur auf die Kompiliergeschwindigkeit aus?
Ist sie nur für große Bauprojekte sinnvoll?
Oder wird der nicht mehr benötigte Code in der ausführbaren Datei schneller ausgeführt?

1 - vielleicht ja, aber in Mikrosekunden =)

2 - eher das Gegenteil - wir sollten die kürzesten Definitionen und das Minimum verwenden.

3 - im Jahr 2008 würde diese Aussage für µl4 zutreffen. Aber die Geschwindigkeit ist jetzt gleich hoch.

 
Alexandr Andreev:

Der Einsatz der normalen Funktionen ist eine Selbstverständlichkeit

d.h. zum Beispiel for (int i=0; i<ArraiSize(max); i++)

hier wird ArraiSize(max); erweitert und erhält so etwas wie die Adresse der Größe des gegebenen Arrays (wenn wir uns das Array ansehen, hat es seine Größe in einer Variablen, und hier haben wir eine Substitution auf diese Variable "Adresse im Speicher"), d.h. es macht überhaupt keinen Sinn, sie in eine Variable zu ändern

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<size; i++)

In diesem Fall haben ArraiSize(max) und size das gleiche Timing für die Bestimmung des Array-Größenwertes

Bei dieser Beispielschleife bin ich mit den Zeitangaben nicht einverstanden.
Im Gegenteil, es wird empfohlen, das Ergebnis in der Größenvariablen zu erhalten und es in der Bedingung zu verwenden.
Der Grund dafür ist, dass bei jeder Iteration vonArraiSize(max) die Schleife unnötig abgewickelt wird, was die Ausführung der Schleife verlangsamt.
Das sind unnötige Anweisungen im Assembler-Code.