【问题标题】:Any useful difference between std::bit_cast and std::start_lifetime_as?std::bit_cast 和 std::start_lifetime_as 之间有什么有用的区别吗?
【发布时间】:2020-02-03 19:57:34
【问题描述】:

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

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

【问题讨论】:

  • 您的意思是,除了其中一个作为 C++20 工作草案完全采用的部分存在之外,另一个是不断变化的提案,未作为任何提案的一部分被采用标准,因此可能永远不会成为标准?
  • @NicolBolas start_lifetime_as 建议用于 C++23,afaik。
  • @NicolBolas 添加了指向它的链接。

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


【解决方案1】:

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);

myFloat、asUint 和 asBytes 是具有不同地址的独立变量。编译器可能能够完全优化它们,但从逻辑上讲,它们是完全不同的值,只是碰巧具有相同的大小和位。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2014-07-22
      • 2023-04-09
      • 2020-10-16
      相关资源
      最近更新 更多