Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

21

07.08.2003, 10:35

wieso Makro mit Funktion ersetzen

Hi Leute,
wieso wollt Ihr eigentlich solche Makros mit Funktionen ersetzen.
Ist der Grund wirklich: "unschön"?
Ein Makro wird vom Compiler vollständig in den Code eingesetzt. Es findet kein Funktionssprung statt.
Sicher, der CODE wird etwas größer, aber es geht doch um Geschwindigkeit, oder?

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

22

07.08.2003, 10:51

@Jens
die #defines werden NUR vom PräProzessor erfasst (Dum ist deine Aussage Falsch das der Compiler sie einsetzt. das macht der PräProzessor! Und das ist ein Unterschied ohne gleichen) und nicht vom Compiler selbst. #Defines arbeiten auf Textebene und sind daher schon sehr typunsicher!

Beispiel:

#define WORT "Das ist ein String";

std::string blub (WORT);

wenn de das schreibst wird dein Compiler jammern aber ohne ende, kann dir aber nicht den genauen fehler sagen weil er nicht weis das es etwas mit #define zu tun hat! (Woher auch, wird ja nicht vom Compiler erfasst sondern nur vom PräProzessor eingebaut!) Dabei liegt es am ; was in WORT drinsteht und es bei "blub" in den beiden klammern aufgerufen wird (Fatal!) Und mal ganz ehrlich, wenn dir der compiler das sagt, das vor "blub" das ; fehle, (diesen error sagt er 100%) wie kommste dann bitte darauf, das es einfach nur an diesem Textbaustein namens #define lag?

oder wenn du schreibst
#define ZAHL 1
einefunktion (ZAHL);

was meinste was ZAHL für ein Typ ist? INT? FLOAT? DWORD? CHAR? CHAR*? STD::STRING?

du weist es nicht, und diese Typunsicherheit kann dir gelegentlich Berechnungsfehler geben aus denen du erstmal nicht rauskommst weil du nicht weist das es an diesem Mist names #define liegt. #define hat KEINEN Typ, da er auf Textbasis arbeitet. Und da liegt schon der große Haken!

Mag sein das #define in den Code reinkopiert wird, da sie auf textbasis arbeiten. aber da sie vom compiler nicht erfasst werden sollte dies schon einer der Hauptpunkte sein sie für Makros und Variablen nicht zu benutzen.

Anonymous

unregistriert

23

07.08.2003, 11:35

das ist schon klar, das der Präprozessor die Ersetzungen vornimmt.
Auch eine Typisierung gibt es:
1: int; 1.0: double; 1.0f: float; 1L: long; _T("string") wird sogar je nach Unicode oder nicht unterschieden usw.
Na ja, jeder wie er will. Ich bin vom Makro überzeugt, wenn es um Geschwindigkeit geht.
Aber mit dem Debuggen hast Du natürlich recht...

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

24

07.08.2003, 12:40

@Jens:
Also mit geschwindigkeit sind Inline-Funktionen weiter vorne als deine #define markos. Meint Stroustrup auch. Naja wer ist schon Stroustrup. die meisten wissen erst gar nicht wer das überhaupt sein soll. traurig :help:

edit:
Zur geschwindigkeit:
Compiliert wird schneller, da durch fehlende #defines der PräProzessor weniger benutzt wird, und der Compiler kann schneller compilieren da nur er selbst benutzt wird und der Compiler ist ansich schneller ans der PräProzessor, im Programm selber macht das keinen unterschied.

Aber wenn du dich gerne bei hoch komplexen programmen z.B. wie ein OS gerne mit compilierzeiten von 1h oder höher gerne annimmst gerne.

In meinem OS an dem ich schon fast 2-3 Jahre werkle hatte ich mit #define locker 30 min compilierzeit, und mit inline über die hälfte weniger zeit.

Anonymous

unregistriert

25

07.08.2003, 14:26

oi

so lange hat bei mir noch nie ein Programm zur Übersetzung gebraucht.
... Weil ich bereits laufende Komponenten in COM- oder andere Bibliotheken stecke und dann evtl. einzeln kompiliere.
Macht es Sinn, alles erneut zu kompilieren?
Nützt Dir die Compileroption "minimales Neuerstellen" etwas?

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

26

07.08.2003, 14:32

beim OS coding kann man nicht mit jedem X-Beliebigen Compiler arbeiten also ist VC++ tabu!

Wenn du ein Projekt hast mit mehr als 90 Dateien aus Source und Headern dazu noch 10 verschiedene Linkerscripts und 5 Dateien bestehend aus Inline Assembler und zusätzlich 10 Obj Dateien. Da bringen MAKE-Files einiges, aber die per Hand schreiben ist ein aufwand OHNE ende!

Es war nur ein Speedbeispiel wie derbst der Unterschied bei enormen Datenmengen zwischen #define und inline funktionen sowie const definitionen ist. und diesen unterschied kann man bei so einem Projekt nicht leugnen das es "nichts" ist oder "wenig".

Vorallem wenn man COM selbst schreibt für sein OS (NICHT für Windows oder Linux und co!) dann weiste ganz genau WIE derbst zeitaufwendig eine compilierung eines OS ist oder eines anderen großen Projektes. Achja, John Carmack hat mal auf einer Pressekonferenz gesagt das jede Compilierung von Doom3 96 Minuten Dauern würde OHNE MAKE-Files und mit noch 12.

Werbeanzeige