2016-02-18 7 views
6

Durch Sascha Willems C++ Vulkan Demos, gehostet auf GitHub, bemerkte ich, dass einige Funktionen den Datentyp VkBool32 zurückgaben.Warum wird VkBool32 von Vulkan als unsigned int implementiert?

Ich war neugierig, warum Khronos hat keinen normalen bool verwenden, wenn ich die Linie bemerkt

typedef uint32_t VkBool32;

in vulkan.h. Die uint32_t als

definiert

typedef unsigned int uint32_t;

in stdint.h.

Meine Frage ist, warum macht es Sinn, 3 Bytes wegzuwerfen, wenn ein Standard-Bool den Job mit nur einem Byte erledigen würde? Meine kleine Recherche zeigte, dass es so gut wie keine Leistungsdifferenz gibt (siehe Which is faster : if (bool) or if(int)?), und Khronos selbst sagte, dass sie Kompatibilitätsprobleme minimieren wollten (in diesem Fall hatte altes C keinen primitiven booleschen Typ), um auf modernen Code zu fokussieren.

(siehe Zitat von here genommen Trevett ist)

einen Boden-up-Redesign, sind wir nicht rückwärts

+6

Es scheint, als ob Sie bereits Ihre eigene Frage beantwortet – JustSid

+0

"Khronos selbst sagte, dass sie Kompatibilitätsprobleme minimieren wollten (in diesem Fall alte C nicht einen primitiven booleschen Typ)" –

+3

"ein Standard Bool würde den Job mit nur tun ein Byte "- unbegründete Annahme. Sie werden mehr als einen Compiler finden, der 'sizeof (bool) == sizeof (int)' hat. – MSalters

Antwort

8

Versuchen kompatibel sizeof(bool) auf Ihrem System zu drucken. Gemeinsame Antworten sind 4 oder 1, und der Wert ist keineswegs universal. Abhängig von den verwendeten Compiler-Flags können Sie unterschiedliche Antworten erhalten.

Vulkan muss auf allen Systemen auf die gleiche Weise funktionieren, und es muss ordnungsgemäß funktionieren, unabhängig davon, welche Compilerflags Sie zum Kompilieren Ihres Programms verwenden. Wenn Vulkan mit sizeof(bool) == 1 kompiliert wurde, aber Sie mit sizeof(bool) == 4 kompilieren, wird die Schnittstelle falsch sein. Ich habe persönlich erlebt, dass dieser besondere Fehler passiert ist.

+1

Klingt vernünftig, aber warum 3 Bytes anstelle von 1 verwenden? –

+4

@JanNilsFerner: Praktisch gibt es eine Menge Hardware dort, wo vier Bytes sinnvoll sind. Um ein einzelnes Byte zu laden, müssen Sie möglicherweise vier Bytes laden und dann die entsprechende Maske und Verschiebung ausführen, was zusätzliche Arbeit bedeutet. –

+2

@DietrichEpp: Danke, macht Sinn! –

Verwandte Themen