Frage

Wenn BOOL Datentyp nicht ohne weiteres vorgegeben wird, habe ich mit der folgenden Definition boolean,

typedef unsigned char BOOL;

(Aufgrund der Speichernutzung).

Ich erkennen, dass es besser sein kann, aus Leistungsgründen nativen Busbreite zu verwenden. Zum Beispiel für einen 32-Bit-Prozessor kann es sein,

typedef unsigned int BOOL;

Nun, was für den 64-Bit-Prozessor passieren wird, wenn ich noch BOOL für die native Busbreite definieren möge.

War es hilfreich?

Lösung

Mindestens x86 und ARM sind in der Lage Laden und ein Byte zu und von einem 32-Bit-Register ohne Strafen zu speichern, so gibt es wirklich keine Auswirkungen auf die Leistung für die Verwendung von char. Ich bin nicht ganz sicher, aber ich würde wetten, dass x86-64 solche Anweisungen zu hat. (Natürlich x86 und x86-64 verarbeiten kann 8-Bit-Werte direkt in den Registern zu.).

So ist die einzige Sorge könnte über Speicher-Layout sein. Natürlich richtet sich der Compiler alles, so die meiste Zeit, char Werte in structs gepolstert erhalten, es sei denn, sie direkt nebeneinander sind, dann könnten Sie tatsächlich ein paar Bytes Platz sparen und eine etwas bessere Cache-Leistung. Wenn Sie große Arrays von BOOLs haben und Speicher ist ein Anliegen, Sie sollten sie etwas sowieso packen.

Auf jeden Fall ist es kein Thema. Warum versuchen Sie nicht, ein Programm laufen in beiden Richtungen erstellt und sehen, ob es auf der Leistung oder Speichernutzung wesentliche Auswirkungen sind. Wenn Sie feststellen, dass es ist, können Sie sich ein Bier kaufen und so tun, als es von mir ist.

Andere Tipps

Ich würde keine Sorgen über die native Busbreite so viel wie ein effizient Breite (das war Ihr Ziel, rechts)? Auf so ziemlich jede Maschine, jeder anständige C-Compiler unsigned int zu einer einigermaßen effizient Breite kompilieren, so dass Sie gut zu gehen.

spekulieren nie auf Leistungen, Maßnahme . Messen, die endgültige Antwort auf das, was ist besser - und vergessen, das bei jedem neuen Compiler-Version kann sich ändern, System-Upgrade ...

Auch Sie eines Tages vielleicht eine Reihe von boolean müssen, wobei in diesem Fall der Prozessor Wort für einen bool verwenden, können nicht die beste Lösung sein.

Warum Sie nicht den Typ bool verwenden in stdbool.h ?

Ich würde empfehlen, Präprozessor zu verwenden.

 #ifndef BOOL 
   #ifdef ILP32
     #define BOOL uint32_t
   #endif
   #ifdef LP64
     #define BOOL uint64_t
   #endif
 #endif

optimal für die meisten Plattform

typedef enum { FALSE = 0, TRUE = 1, } BOOL;

Nun könnte man immer die typedef definieren long long oder so etwas, aber ich bin wirklich nicht sicher, dies ist etwas, das Menschen aus irgendeinem Grund tun. (Sie könnten wahrscheinlich auch eine bedingte Definition tun basierend auf sizeof (int *) oder so ähnlich).

ein Zeichen verwendet, kann langsamer sein als eine ganze Zahl verwendet wird.

int_fast8_t von stdint.h sollte gut sein Wahl

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top