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

mar*_*964 4 c++ c++-standard-library type-punning c++20

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

对于没有提供有关这些新功能的更多信息,提前致歉。我只是在观看了关于类型双关的 cppcon 2019 讲座后才听说过它们,而且我无法start_lifetime_as通过谷歌找到太多相关信息。我希望看到这个的其他人可能会知道更多。

Dav*_*ing 10

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


Par*_*tes 7

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);
Run Code Online (Sandbox Code Playgroud)

myFloat,asUintasBytes是具有单独地址的单独变量。编译器可能能够将它们完全优化掉,但从逻辑上讲,它们是完全不同的值,恰好具有相同的大小和位。

std::start_lifetime_as什么都不。它只是通知编译器它可以将内存范围视为包含指定类型的数组。然后,这允许开发人员将该内存用作数组,而不会触发未定义的行为。它不会物理修改传递给它的内存,也不会返回任何内容。它纯粹用于 C++ 对象模型簿记。