Um Konstanten zu definieren, was ist der üblichere und korrekte Weg? Wie hoch sind die Kosten für die Definition, Konstanten, Verlinkung usw. von #define? Es ist ein anderer Weg weniger teuer?Was kostet ein #define?
Antwort
Der beste Weg, um jede const zu definieren ist
const int m = 7;
const float pi = 3.1415926f;
const char x = 'F';
Mit #define
a ++ schlecht c Stil zu schreiben. Es ist unmöglich, #define
im Namensraumbereich zu verstecken.
Vergleich
#define pi 3.1415926
mit
namespace myscope {
const float pi = 3.1415926f;
}
zweitem Weg ist natürlich besser.
+1 '# define' ist auch schlechter Stil, weil es keine explizite Typ Informationen zum Compiler gibt. – GrahamS
Dies fasst die Stilempfehlungen treffend zusammen, beantwortet aber die Frage nicht. Konstanten, die im richtigen C++ - Stil deklariert sind, haben Kosten, die #defines nicht haben. –
@Dan Olson: Aah aber #defines haben auch eine Kosten in Bezug auf die Code-Größe, als (abhängig von Compiler-Smarts) können Sie am Ende viele Literale einzuführen, wo eine einzige const getan hätte. @Espuz: keine der Kosten ist es wert, sich Gedanken darüber zu machen (es sei denn, du machst sehr Low-Level-Mikroprozessor Zeug), also geh mit dem besseren Stil, der 'const' wo möglich ist. – GrahamS
Die Kosten sind nur für den Präprozessor, wenn #defines aufgelöst werden (die zusätzlichen Debugging-Kosten des Umgangs mit einem Projekt mit #defines für Konstanten natürlich ignorierend).
#define
ist String-Ersatz. Wenn Sie also Fehler in den Makros machen, werden sie später als Fehler angezeigt. Meistens sind falsche Typen oder falsche Ausdrücke üblich.
Für die bedingte Kompilierung funktionieren Preprozessor-Makros am besten. Für andere Konstanten, die in der Berechnung verwendet werden, funktioniert const
gut.
#define
Makros werden vom Preprozessor verarbeitet, sie sind für den Compiler nicht sichtbar. Und da sie für den Compiler als Symbol nicht sichtbar sind, ist es schwierig etwas zu debuggen, das ein Makro beinhaltet.
Die bevorzugte Methode zum Definieren von Konstanten besteht in der Verwendung des Schlüsselwortes const und der richtigen Typinformation.
const unsigned int ArraySize = 100;
Noch besser ist
static const unsigned int ArraySize = 100;
wenn die Konstante nur in einer einzigen Datei verwendet wird.
#define wird Compilation Zeit zu erhöhen, aber es wird schneller in der Ausführung ...
im Allgemeinen in der bedingten Kompilierung #define verwendet wird ...
wo const im allgemeinen Berechnung von Zahlen verwendet wird
Die Auswahl hängt von Ihrer Anforderung ab ...
Im besten Fall wird die Geschwindigkeitserhöhung mit #define marginal sein. Wenn der Compiler die Konflikte optimiert, wird es keinen Vorteil geben und Sie verlieren alle Vorteile von const. – JeremyP
ja ... #define ist praktisch in Conditional Compilation (in Cross-Plattform-Anwendung ...) Es ist der einzige Vorteil, der in Betracht gezogen werden kann ... –
Der Compiler selbst sieht nie eine #define. Der Präprozessor erweitert alle Makros, bevor sie an den Compiler übergeben werden. Eine der Nebenwirkungen ist jedoch, dass die Werte wiederholt werden ... und zwei identische Zeichenfolgen sind nicht unbedingt die exakt gleiche Zeichenfolge. Wenn Sie sagen,
#define SOME_STRING "Just an example"
es ist vollkommen legal für die Compiler eine Kopie des Strings in die Ausgabedatei jedes Mal hinzufügen die Zeichenfolge sieht. Ein guter Compiler wird wahrscheinlich doppelte Literale eliminieren, aber das ist zusätzliche Arbeit. Wenn Sie stattdessen const verwenden, muss sich der Compiler nicht so viele Sorgen machen.
CPU-Zeit ist nicht wirklich die Kosten für die Verwendung von #define oder Makros. Die "Kosten" als Entwickler ist wie folgt:
Diese Dinge können nicht CPU-Zyklen brennen, aber sie können Entwicklerzyklen brennen.
Für Konstanten ist die Deklaration von const
Variablen vorzuziehen, und für kleine typunabhängige Funktionen sind Inline-Funktionen und Templates vorzuziehen.
- 1. Was kostet JavaScript Routing?
- 2. Was kostet $ .when für ein einzelnes $ .Löschen?
- 3. Was kostet es, Task.Delay() zu verwenden?
- 4. Was kostet TIME_WAIT auf der Serverseite?
- 5. Was ist 'typeof define ===' funktion '&& define [' amd ']' verwendet für?
- 6. #define ein Tupel in C
- 7. Was macht "#define (exp) ((void) 0)"?
- 8. Was ist define ([, function]) in JavaScript?
- 9. Was ist define * in Guile oder Schema?
- 10. Was kostet das Erstellen von Schauspielern in Akka?
- 11. Ein #define in C mit drei Punkten
- 12. Gibt es ein #define für C99?
- 13. Was kostet auf jeder Seitenseite mehr Geld - Datenbankschreibvorgänge oder Dateischreibvorgänge?
- 14. Was kostet (in Zyklen) zwischen Windows Kernel und Benutzermodus?
- 15. Was kostet die Verwendung von Ausnahmen in Objective-C?
- 16. Was kostet mich die Verwendung von RESTful-URLs?
- 17. Was kostet $? $ 0 $ 1 $ 2 bedeuten in Shell-Skript?
- 18. Was kostet die Bindung eines Rails Servers an 0.0.0.0?
- 19. SENSOR_DELAY_GAME: Wie viel kostet das?
- 20. GLSL - Kostet ein Dot-Produkt wirklich nur einen Zyklus?
- 21. Wie viel kostet eine CGAffineTransformMakeRotation()?
- 22. define nicht
- 23. Legacy-C++ verstehen #define
- 24. Wie kostet eine Corporate Web App?
- 25. Entspricht #define in Java?
- 26. # define-Direktive Frage
- 27. warum sendto kostet viel mehr als recvfrom
- 28. Größe von #define Werte
- 29. Welcher Code kostet mehr auf Leistungsniveau
- 30. isalnum äquivalent mit #define
Wählen Sie eine Sprache, eine Sprache? –
@Kyle: Siehe Tags. – Cam
C# lässt nicht zu, dass '# define' verwendet wird, um Konstanten zu definieren. Du kannst '#define DEBUG', aber nicht' #define DEBUG 1' definieren. http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx –