std::bit_cast 和 std::start_lifetime_as 之间有什么有用的区别吗?

Any useful difference between std::bit_cast and std::start_lifetime_as?

std::bit_cast 显然是在 c++20 中引入的。 std::start_lifetime_as 是为 c++23 提出的(来自 P0593R5)。由于它们似乎都要求所涉及的数据类型无论如何都是微不足道的,所以一旦引入后者,是否还需要前者?

很抱歉没有提供更多关于这些新功能的信息。我是在观看了 cppcon 2019 的类型双关讲座后才听说的,但我找不到太多关于 start_lifetime_as 和 google 的信息。我希望看到这个的其他人可能知道更多。

答案很简单:bit_cast returns 一个值,而 start_lifetime_as “改变”记忆(以抽象机器中存在的方式但预计不会影响任何物理位)。您使用前者(一次)将现有对象解释为一组位;您使用后者(永久地)将现有位解释为一个对象。

std::bit_cast复制其参数的位到不同类型的新值。

float myFloat = 3.14;
auto asUint = std::bit_cast<uint32_t>(myFloat);
auto asBytes = std::bit_cast<std::array<char,4>>(myFloat);

myFloatasUintasBytes 是具有独立地址的独立变量。编译器可能能够完全优化它们中的一些,但从逻辑上讲它们是完全不同的值,只是恰好具有相同的大小和位数。

std::start_lifetime_as 不会 任何事情。它只是通知编译器它可以将一段内存视为包含指定类型的数组。然后,这允许开发人员将该内存用作数组而不会触发未定义的行为。它不会物理修改传递给它的内存,也不会 return 任何东西。纯粹是为了C++对象模型记账。