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

Jan*_*ner 7 c c++ performance vulkan

通过在GitHub上托管的Sascha Willem的C++ Vulkan演示,我注意到一些函数返回了数据类型VkBool32.

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

typedef uint32_t VkBool32;

在vulkan.h.uint32_t定义为

typedef unsigned int uint32_t;

在stdint.h中.

我的问题是,如果一个标准的Bool只用一个字节来完成这个工作,为什么它会让Sense丢掉3个字节?我的小Recherche显示没有性能差异(请参阅哪个更快:if(bool)或if(int)?),而Khronos他们自己说他们希望最小化兼容性问题(在这种情况下,旧C没有原始布尔类型)以便专注于现代代码.

(见Trevett的报价取自这里)

一个彻底的重新设计,我们不向后兼容

Die*_*Epp 11

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

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

  • @JanNilsFerner:实际上,有很多硬件在那里有四个字节是有意义的.为了加载单个字节,您可能必须加载四个字节然后执行适当的掩码和移位,这是额外的工作. (5认同)
  • 听起来很合理,但是为什么要使用 3 个字节而不是 1 个呢? (2认同)
  • @DietrichEpp:谢谢,有道理! (2认同)