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

时间:2019-10-06 03:38:24

标签: c++ c++-standard-library c++20 type-punning

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

事先致歉,未提供有关这些新功能的更多信息。我只是在看了cppcon 2019关于类型整形的讲座后才听说它们的,而我在Google上找不到关于start_lifetime_as的更多信息。我希望其他人对此有所了解。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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