在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是不是有效?
Posted
技术标签:
【中文标题】在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是不是有效?【英文标题】:Is it valid to cast integer to GLvoid* in C++20 using bit_cast?在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是否有效? 【发布时间】:2019-08-20 17:59:59 【问题描述】:previous question 询问如何在 C++11 中的整数类型和 GLvoid*
之间进行转换(基于该问题的标签),但这里我对 C++20 感兴趣。
现在有std::bit_cast
作为进行类型转换的选项,我想知道将整数与OpenGL 函数一起使用是否是“正确”的方式,因为历史原因需要GLvoid*
来表示一个字节偏移量(例如glDrawRangeElements),或者是否应该使用上一个问题中引用的方法。
【问题讨论】:
【参考方案1】:bit_cast
在这里绝对是错误的。 void*
不需要与大多数整数类型的大小相同。 bit_cast
要求源类型和目标类型具有完全相同的大小。因此,在 32 位系统上,std::bit_cast<void*>(24ull)
是编译错误。在 64 位系统上,简单的 std::bit_cast<void*>(24)
是编译错误。
甚至uintptr_t
也不需要与指针具有相同的大小;只是它的位数至少与指针一样多。如果它有更多,那么bit_cast
会窒息它。
如果您不想使用 C 样式转换,只需执行 reinterpret_cast<void*>
。
【讨论】:
【参考方案2】:不,尽管(使用适当大小的整数)它在实践中通常会起作用,而且这些都不是严格符合的。这是一个 C API,所以它表示 (void*)offset
(在 C 中)。如果您的工具链具有预期的 C 兼容性),您可以用 C++ 编写它,在这种情况下,它等同于 reinterpret_cast<void*>(offset)
,但不一定等同于 bit_cast<void*>(offset)
(即使 reinterpret_cast
没有,它也会保留位模式,另外要求sizeof offset==sizeof(void*)
)。
【讨论】:
以上是关于在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章