2010-12-15 12 views
2

Ich portiere derzeit etwas Code von einer anderen Plattform und bools auf der neuen Plattform sind 1-Byte-Größe. Dies bricht unseren Ladecode, da die Werte als 32-Bit-Werte gespeichert werden. Darüber hinaus ist die Geschwindigkeit ein kritisches Thema auf unserer Plattform und wir möchten 32-Bit-Boole verwenden, da der Prozessor nativ mit 32 Bit arbeitet und zusätzliche Operationen zum Vergleichen von Nicht-32-Bit-Bools erfordert.Wie erzwinge ich die Größe eines 'Bool' unter GCC

Gibt es eine Möglichkeit, gcc zu zwingen, 32-Bit-Bools anstelle von 8-Bit-Bools zu verwenden?

+0

Leider kenne ich nur den -mone-byte-bool Schalter auf Apples GCC, aber es tut das Gegenteil von dem, was Sie wollen. –

+0

Ich nehme an, dass die Festlegung Ihres Ladecodes nicht in Frage kommt. (es sollte wirklich keine Annahmen über die Größe der eingebauten Typen wie "int" oder "bool" machen) – jalf

+0

Es stellt sich heraus, dass der Ladecode den Unterschied in den Größen bereits korrekt behandelt. Das Problem kam von einem anderen Teil des Ladecodes, der davon ausging, dass eine Aufzählung 4 Byte groß wäre. Das wurde gelöst, indem man einfach einen "FORCE_DWORD" -Wert eingab. –

Antwort

1

Sie könnten Ihre eigene Klasse erstellen, die intern int32_t verwendet, sich aber wie ein bool verhält. Es bedeutet, dass Sie die Felder umbenennen müssen, die Sie speziell für diesen Typ verwenden möchten, was mehr Arbeit bedeutet, aber bessere Kontrolle und Isolation bietet, und Sie können immer noch echte bool s an anderer Stelle verwenden. Ich persönlich würde das jedem #define-Hacker vorziehen, der irgendwo unerwartet etwas beißen könnte. Ich warne auch davor, anzunehmen, dass ein 32-Bit int nützlicher sein wird als ein einzelnes Byte ... andere Faktoren wie Pipelining, Speicherlatenzen, Cache-Größen usw. könnten den Unterschied insignifikant machen oder sogar 32-Bit int s langsamer machen, Sie sollten es also in Ihrem System mit einer repräsentativen Datenverarbeitung vergleichen.

+0

Dies ist eigentlich die Option, die ich kurz nach dem Posten dieses kam. War nicht ideal, aber war besser als ein typedef/# define, da ich den Unterschied zwischen den Typen brauchte, um vom Compiler erkannt zu werden. –

2
#define bool int 
+2

Das ist dumm und es wird zu viele Dinge brechen. – wilx

+5

@wilx, wenn der Ladecode so geschrieben ist, dass die Größe des Bool an zu vielen Stellen angenommen wird, um ihn zu reparieren, dann ist der Code schon dumm und kaputt. –

3

Die Größe der Bool ist Implementierung definiert (5.3.3) und gcc nicht erscheint eine Option zur Verfügung zu stellen diese zur Laufzeit zu konfigurieren.

Hoffentlich ist Ihr implementierungsdefinierter Code isoliert. Wenn ja, ändern Sie Ihre bool s zu int s, oder Ihr Laden-Code ändern mit sizeof() == umgehen 1 statt 4.

(Oder für die verrückt, ändern gcc bool als 4-Byte zu behandeln Typ.)

Bearbeiten: Paul Tomblins Vorschlag der Verwendung #define ist möglicherweise nicht legal [see here], aber es funktioniert zumindest unter gcc 4.1.2. [Link] Wenn Sie jedoch nicht jede Verwendung von bool treffen, wird die Größenabweichung wahrscheinlich Sie beißen.

+0

Die Art, wie ich die Antwort auf die verknüpften Fragen lese, ist, dass es illegal ist, '#define bool int' vor dem Einfügen eines Standard-Headers zu tun, aber es ist in Ordnung, danach zu tun. Sie können nicht erwarten, die Länge von Bools in Code zu ändern, den Sie nicht kompilieren, wie externe (und Standard) Bibliotheken. –

+0

@Paul: Das, und Sie werden Kompilierungsfehler erhalten, wenn sie spezialisierte Vorlagen sowohl auf bool als auch auf int. (Wie zum Beispiel "Iostream".) Die wirkliche Herausforderung ist, dass, wenn 'bool' in ihrer Codebasis so weit verbreitet ist, dass sie nicht einfach' s/bool/int/g' verwenden können, dann die 'define' an jedem Ort, der' bool' verwendet, nicht ausführen kann könnte ein echtes Problem sein. – Bill

6

#define BOOL_TYPE_SIZE 4 zu gcc/config/i386/i386.h hinzufügen und gcc neu kompilieren;)

1

Sie benötigen eine internen Datenstrukturen aus dem Speicher/Ladecode zu trennen. Speichern Sie einfach die Boole in Ihren internen Datenstrukturen im nativen Typ bool der Plattform und führen Sie die entsprechende Konvertierung von/zu den Ein-Byte-Bool-Werten des Speichers aus, wenn Sie die Daten lesen/schreiben.