为什么 Vulkan 的 VkBool32 实现为 unsigned int?

Why is Vulkan's VkBool32 implemented as an unsigned int?

查看 GitHub 上托管的 Sascha Willem 的 C++ Vulkan 演示,我注意到一些函数返回数据类型 VkBool32

当我注意到这条线时,我很好奇为什么 Khronos 没有使用普通的 bool

typedef uint32_t VkBool32;

在 vulkan.h 中。 uint32_t 定义为

typedef unsigned int uint32_t;

在 stdint.h.

我的问题是,如果标准 Bool 只需一个字节就可以完成工作,为什么丢弃 3 个字节有意义?我的小 Recherche 表明几乎没有性能差异(请参阅 Which is faster : if (bool) or if(int)?),并且 Khronos 自己说他们希望最大限度地减少兼容性问题(在这种情况下,旧 C 没有原始布尔类型)以便专注于现代代码。

(参见 Trevett 的引述 here

a ground-up redesign, we’re not backwards compatible

尝试在您的系统上打印 sizeof(bool)。常见的答案是 4 或 1,这个值绝不是普遍的。根据您使用的编译器标志,您可以获得不同的答案。

Vulkan 需要在所有系统上以相同的方式工作,并且无论您使用什么编译器标志来编译程序,它都需要正确工作。如果 Vulkan 是使用 sizeof(bool) == 1 编译的,但您使用 sizeof(bool) == 4 编译,则接口将不正确。我亲眼目睹了这个特殊错误的发生。