【问题标题】:std::byte on odd platforms奇怪平台上的 std::byte
【发布时间】:2017-09-22 17:01:54
【问题描述】:

阅读 Herb Sutter 关于最近的 C++ 标准会议的博文,注意到 std::byte 已添加到 C++17。作为初步阅读,我有一些顾虑,因为它使用了unsigned char,因此它可以避免严格的别名规则的复杂性。

我最担心的是,它如何在CHAR_BIT 不是 8 的平台上工作?我曾在CHAR_BIT 为 16 或 32(通常是 DSP)的平台上工作过。鉴于std::byte 用于处理“面向字节的内存访问”,并且大多数人将字节理解为表示八位字节(而不是底层字符类型的大小),这对于期望这将解决的个人如何工作连续的 8 位内存块?

我已经看到有人只是假设CHAR_BIT 是 8(不是晚上知道CHAR_BIT 存在......)。称为std::byte 的类型可能会给个人带来更多的困惑。


我想我所期望的是他们正在引入一种类型,以允许在所有情况下一致地寻址/访问顺序八位字节。在许多面向八位字节的协议中,拥有一个保证在所有平台上一次访问一个八位字节的库或类型会很有用,无论在给定平台上CHAR_BIT 等于什么。

我完全可以理解想要明确说明某些东西被用作字节序列而不是字符序列,但它似乎不像许多其他东西那样有用。

【问题讨论】:

  • 就标准而言,一个字节具有CHAR_BIT 位。这就是为什么sizeof(char) 始终为 1,即使在那些 DSP 上也是如此。
  • 这些人需要调整他们的期望。或者,更坦率地说,别再犯错了。
  • 如果您担心某些人可能会错误地使用它,那么 C++ 中的所有内容都是如此。您有更具体的问题吗?
  • @NathanOliver,这是否意味着一个std::byte 具有CHAR_BIT 位而sizeof (std::byte) 始终为1?
  • en.cppreference.com/w/cpp/types/byte,它基本上 is 无符号字符,sizeof 将为 1。它只是有不同的类型,所以你不能不小心将它用作字符串或整数类型,是我第一眼的印象。

标签: c++ c++17


【解决方案1】:

鉴于std::byte 用于处理“面向字节的内存访问”,并且大多数人将字节理解为指示八位字节(而不是底层字符类型的大小),这对于期望的个人如何工作这将解决连续的 8 位内存块?

你不能理解错了,然后期望世界重新安排自己以符合你的期望。

大多数人认为字节和八位字节是同一事物的原因是因为在大多数情况下它是正确的。绝大多数典型计算机都有CHAR_BIT == 8。这并不意味着它一直都是正确的。

  • 字节不是八位字节。
  • charsigned charunsigned char 的大小为 1 个字节

不过,好的一面是,不知道这一点的人实际上是不需要知道的人。如果您正在使用一个字节由多于一个八位字节组成的机器上工作,那么您就是那种比其他任何人都需要了解这一点的开发人员。

如果我们在这里谈论理论,那么答案很简单:只需了解一个字节与一个八位字节不同。如果我们在谈论具体的东西,那么答案是您要么已经知道差异,要么您不需要知道它(希望:))。最糟糕的情况是你学习这个很痛苦,但这是第三个在异国知识的异国平台上工作的少数开发人员。


如果您想要八位字节的等价物,它已经存在:

请注意,它们“仅在实现直接支持该类型时提供”。

【讨论】:

  • 然而,这些并不能保证适用于人们使用的大多数用途。 int8_t 不能保证是signed char(或只是char)的别名,因此您不能使用它们对数据进行别名并避免严格的别名违规。
  • 我同意用户明智的最终解决方案是std::octet,但这可能几乎不可能在最小可用大小超过 8 位(比如 16 位)的平台上实现。因此,出于语言的可移植性原因,我不确定你会不会有比这更好的东西,不过我很想错 :)
猜你喜欢
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2014-01-31
相关资源
最近更新 更多