在 C++ 中,有关类型的信息存储在哪里以及如何执行类型安全检查?

In C++, where the info about type is stored and how type safety check is performed?

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

变量本身不包含任何关于它包含的内容的信息。相反,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);

编译器对此的看法包括 x 是一个 int32_tconvert 是一个 int32_t 和 returns 一个 doubley 是一个 double。由于所有这些都排成一行,因此不需要进行任何转换并且可以成功编译。对比:

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

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

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

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

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

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