【问题标题】:In C++, where the info about type is stored and how type safety check is performed?在 C++ 中,关于类型的信息存储在哪里以及如何执行类型安全检查?
【发布时间】:2015-08-21 00:22:42
【问题描述】:

类型安全在 C++ 中是一件大事。不支持隐式转换的不同类型的变量不能设置为相等。 如何执行此安全检查? 除了变量本身,还有一些关于为该变量存储的类型的信息吗?

【问题讨论】:

    标签: c++ type-safety


    【解决方案1】:

    变量本身不包含有关它所包含内容的任何信息。相反,C++ 使用其编译步骤来执行各种验证步骤,以确保在运行时一切正常。

    简单地说,如果我有以下功能:

    double convert(int32_t num)
    {
        return static_cast<double>(num);
    }
    

    它编译成一个过程,该过程接受其唯一的参数并执行 32 位整数到 64 位浮点的转换。如果你给它一个 32 位浮点数,它会做不正确的事情。

    然而,类型系统确保任何调用 convert 的人都提供 32 位整数(请注意,在某些情况下,编译器可能会代表您插入转换,但该函数只会看到 32 位整数),因此无需运行时检查您提供的内容实际上是 32 位整数。

    类型系统在编译时确实存在,并且被非常仔细地跟踪。举个例子:

    int32_t x = 12;
    double y = convert(x);
    

    编译器对此的看法包括xint32_tconvert 采用int32_t 并返回doubleydouble。由于所有这些都排成一行,因此无需转换,并且可以成功编译。相比之下:

    char* x = "12";
    double y = convert(x);
    

    无法编译,因为 char *int32_t 不同(并且不可转换)。

    【讨论】:

    • 所以编译器会检查,这就是说“C++是静态类型语言”的意思吗?
    • @Allanqunzi:是的,直到您真正深入了解静态类型的含义。从技术上讲,我们讨论的这两个概念并不完全重叠,但几乎每个实现都会重叠。
    【解决方案2】:

    C++ 被设计为一种编译 语言。这意味着编译器在编译时执行语言规范所需的任何检查。此类检查所需的一切都由编译器存储在编译器的内部数据结构中。这些数据结构仅在编译期间存在。

    一旦 C++ 代码成功编译为可执行代码,所有检查就完成了。不再存储任何内容。不再检查任何内容。

    换句话说,C++ 语言中的类型安全检查是静态的

    这个原则的唯一例外是dynamic_cast 的功能,它可以执行某些运行时(动态)类型检查。为此,确实需要存储一些运行时类型信息(RTTI)。相同的数据通过typeid 用于运行时类型识别。但这是一个单独的主题,它并没有真正覆盖 C++ 中的通用类型检查本质上是静态这一事实。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多