std::bit_cast
显然在 c++20 中被引入。而 std::start_lifetime_as
则被提议用于 c++23(来自P0593R5)。由于它们似乎都要求所涉及的数据类型是平凡的,一旦后者被引入,前者还有必要吗?
提前为这些新特性未提供更多信息向大家道歉。我刚刚在观看 cppcon 2019 上关于类型转换的演讲后才听说它们,而且我在谷歌上找不到关于 start_lifetime_as
的太多信息。我希望看到这个的其他人可能会知道更多。
std::bit_cast
显然在 c++20 中被引入。而 std::start_lifetime_as
则被提议用于 c++23(来自P0593R5)。由于它们似乎都要求所涉及的数据类型是平凡的,一旦后者被引入,前者还有必要吗?
提前为这些新特性未提供更多信息向大家道歉。我刚刚在观看 cppcon 2019 上关于类型转换的演讲后才听说它们,而且我在谷歌上找不到关于 start_lifetime_as
的太多信息。我希望看到这个的其他人可能会知道更多。
bit_cast
返回值,而start_lifetime_as
“更改”内存(以存在于抽象机器中但不会影响任何物理位的方式)。您可以使用前者将现有对象一次性解释为一组位;您可以使用后者将现有位永久地解释为一个对象。start_lifetime_as
执行结束后,源对象的生命周期是否结束?如果是,那么尝试使用旧指针变量进行引用(提及)是否不合法,或者仅仅访问是不合法的? - sandthornstart_lifetime_as
仅 取决于 UB 生命周期规则,那就有点可怕了。 [LIVE] 这意味着编译器无法帮助那些可能会忘记生命周期规则的人。如果 start_lifetime_as
在被误用时能够调用非法形式,那将更加安全。 - sandthornstd::bit_cast
将其参数的位复制到不同类型的新值中。
float myFloat = 3.14;
auto asUint = std::bit_cast<uint32_t>(myFloat);
auto asBytes = std::bit_cast<std::array<char,4>>(myFloat);
myFloat
、asUint
和asBytes
是具有不同地址的独立变量。编译器可能能够完全优化它们,但从逻辑上讲,它们是完全不同的值,只是恰好具有相同的大小和位。
std::start_lifetime_as
没有做任何事情。它只是告诉编译器,可以将一段内存视为包含指定类型数组的范围。这样,开发人员就可以将该内存用作数组,而不会触发未定义行为。它不会物理修改传递给它的内存,也不会返回任何内容。它仅用于C++对象模型的记录。
编辑:Robert Leahy拥有一个出色的演示文稿,解释了这些函数被创建来解决哪些问题以及它们如何实现。
start_lifetime_as
。 - markt1964