代码之家  ›  专栏  ›  技术社区  ›  Hatted Rooster

std::byte[重复]的用例

  •  6
  • Hatted Rooster  · 技术社区  · 8 年前

    最近添加的 std::byte 对于C++17,我想知道为什么会将这种类型添加到标准中。即使在阅读之后 the cppreference reference 对我来说,用例似乎并不清楚。

    我能想到的唯一用例是它更清楚地表达意图,如 std::字节 应仅视为位的集合,而不是字符类型,如 char 我们以前都用过。 意思是:

    这是:

    std::vector<std::byte> memory;
    

    比这更清楚:

    std::vector<char> memory;
    

    这是将其添加到标准中的唯一用例和原因,还是我在这里遗漏了一个要点?

    1 回复  |  直到 8 年前
        1
  •  10
  •   Edgar Rokjān    8 年前

    我能想到的唯一用例是它更清楚地表达了意图

    我认为这是原因之一。 This paper 解释背后的动机 std::byte 并将其用法与 烧焦 :

    动机和范围

    许多程序需要面向字节的访问 记忆力如今,此类程序必须使用char、signed char或 用于此目的的无符号字符类型。但是,这些类型执行 三重负载。它们不仅用于字节寻址,还用作 算术类型和as字符类型。角色的多样性 打开程序员错误的门,例如意外执行 应视为字节值的内存上的算术运算,以及 程序员和工具都感到困惑。 具有独特的字节类型 通过区分面向字节的内存访问,提高了类型安全性 以字符或整数值形式访问内存。它改进了 可读性。

    拥有该类型也会产生代码的意图 读者更清楚(以及用于理解和 转换程序)。它通过移除 程序员意图表达的模糊性,从而增加 分析工具的准确性。

    另一个原因是 std::byte 在可在此类型上执行的操作方面受到限制:

    与char和unsigned char一样,它可以用来访问原始内存 被其他对象占用(对象表示),但不同于 类型, 它不是字符类型,也不是算术类型 . A. 字节只是位的集合,并且 仅按位逻辑运算符 为其定义 .

    这确保了上述文件中提到的额外类型的安全性。