【问题标题】:What is the purpose of std::byte?std::byte 的目的是什么?
【发布时间】:2017-11-24 23:34:18
【问题描述】:

既然 c++17 有 std::byte,我正在寻找一种方法,将读取文件的代码转换为 char 的代码,将文件读取到 byte 的代码。文件包含字节,而不是一堆整数。

然后我读到this questionthis other question,人们认为将文件读入byte 是错误的,而将文件读入char 是正确的。

如果byte不是为访问内存而设计的,以此类推,文件的目的是什么?正如在其他两个问题中所引用的那样:

与 char 和 unsigned char 一样,它可用于访问原始内存 被其他对象占据(对象表示),但不同于那些 类型,它不是字符类型,也不是算术类型。一种 byte 只是位的集合,并且只有位逻辑运算符 是为它定义的。

这听起来像是应该用于读取文件的确切类型,而不是字符。

【问题讨论】:

  • 将其视为词汇类型。如果您打算操作对象的 bytes,后者更具表现力,unsigned char*std::byte*?
  • 说实话,我也没有真正看到它的目的。允许的操作似乎是任意的。位操作(例如加法)之间有什么区别?为什么一个是允许的,一个是禁止的?但我同意 StoryTeller 的观点,std::byte 在您只想存储/读取/写入一些字节时是一个更具表现力的名称。我认为我永远不会使用它(除非有人能给我们一个启发性的答案),因为 unsigned char 对我来说很好
  • @geza:好吧,理论上,加法之类的事情会为各个位分配含义,而位操作则不会。如果您的字节代表一个数字(为什么还要使用加法),请使用整数类型。在实践中,这打破了像 i & (i-1) 这样的一些比特小技巧,它们也只想执行位操作。
  • @MikeMB:很好的例子!这是我不使用std::byte 的另一个原因。 (有人可能会争辩说,应该有一个 clearLowestBit(std::byte) 函数,它在内部进行强制转换 - 但我并没有真正看到禁止对字节进行常规操作的好处,比如加法)
  • @MikeMB: ... 有很多位技巧,需要进行数值运算。你不能用std 函数覆盖它们。

标签: c++ byte c++17


【解决方案1】:

你可能误解了一些事情。

byte 非常适合“访问内存”。当存储只是字节序列而不是字符数组时,您打算使用该类型。

Iostream 类型不能用byte 专门化,因为它们是围绕字符设计的,作为它们的接口。也就是说,他们不认为文件是字节序列。他们认为它们是字符序列。现在,您当然可以使用一两个强制转换直接读入byte 数组。但这不是 iostream 原生的想法。

您必须区分 iostream 的工作方式和 文件 的工作方式。毕竟,iostream 只是一个文件 IO 库;它几乎不是文件 API 的全部。

大多数用于读取二进制数据的文件 API 采用 void* 而不是字符数组。 std::fread/fwrite,等等。

也就是说,你应该认为这不是std::byte 的问题,而是iostream 的问题。只是其中的一个。

【讨论】:

  • Iostreams 再次罢工,停止使用它
  • 据我所知,iostream (std::fstream) 是使用 Unicode 文件名的唯一跨平台方式 - 使用 std::filesystem::path 重载。是否有计划为 std::fopen 添加类似的重载或提供从文件中读取二进制数据的不同方式?
  • @Nikolai:委员会不愿意对 C 标准库 API 进行修改。但是 ifstream API 在读取二进制数据方面非常有用。
  • @Nicol Bolas: this comment 建议 iostreams 不适合对文件的原始访问 - 这是不正确的吗?也许您可以澄清一下字节和字符之间的确切区别是什么?
猜你喜欢
  • 2014-04-04
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多