【问题标题】:Why is Vulkan's VkBool32 implemented as an unsigned int?为什么 Vulkan 的 VkBool32 实现为 unsigned int?
【发布时间】:2016-05-30 23:46:14
【问题描述】:

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

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

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 的引文)

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

【问题讨论】:

  • 您似乎已经回答了自己的问题
  • “Khronos 自己说他们想尽量减少兼容性问题(在这种情况下,旧 C 没有原始布尔类型)”
  • “一个标准的布尔值只需要一个字节就可以完成这项工作”——没有根据的假设。你会发现不止一个编译器有sizeof(bool)==sizeof(int)
  • 链接的问题是 x86 特定的。还有(幸运的是)其他架构可能会产生不同的结果并具有不同大小的bool。该标准不需要sizeof(bool) == sizeof(char)。而且根本不可能是内存问题。此外,C 确实具有布尔类型(_Boolstdbool.h 提供 bool 宏)。
  • @Keith 我指的是标准定义的bool,而不是实现定义的_Bool,但这就是将问题标记为C/C++ 的结果。无论如何,请参阅 C++ 标准中的脚注 69,从字面上看它可以更大。

标签: c++ c performance vulkan


【解决方案1】:

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

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

【讨论】:

  • 听起来很合理,但为什么要使用 3 个字节而不是 1 个字节?
  • @JanNilsFerner:实际上,有很多硬件在其中四个字节是有意义的。为了加载单个字节,您可能必须加载四个字节,然后执行适当的掩码和移位,这是额外的工作。
  • @DietrichEpp:谢谢,有道理!
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2021-08-07
  • 1970-01-01
  • 2010-12-24
  • 2018-08-25
  • 2010-09-05
  • 2011-02-17
相关资源
最近更新 更多