在 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_t
,convert
是一个 int32_t
和 returns 一个 double
和y
是一个 double
。由于所有这些都排成一行,因此不需要进行任何转换并且可以成功编译。对比:
char* x = "12";
double y = convert(x);
无法编译,因为 char *
与 int32_t
不同(并且不可转换)。
C++ 被设计为编译 语言。这意味着语言规范要求的任何检查都由编译器在编译时执行。此类检查所需的一切都由编译器存储在编译器的内部数据结构中。这些数据结构仅在编译期间存在。
一旦C++代码成功编译成可执行代码,所有检查就完成了。不再存储任何内容。不再检查任何内容。
换句话说,C++ 语言中的类型安全检查是静态的。
此原则的唯一例外是 dynamic_cast
的功能,它可以执行某些 运行 时间(动态)类型检查。为此,确实需要存储一些 运行 时间类型信息 (RTTI)。通过typeid
,相同的数据用于运行-时间类型识别。但这是一个单独的主题,它并没有真正覆盖 C++ 中的一般类型检查本质上是 static 的事实。
类型安全在 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_t
,convert
是一个 int32_t
和 returns 一个 double
和y
是一个 double
。由于所有这些都排成一行,因此不需要进行任何转换并且可以成功编译。对比:
char* x = "12";
double y = convert(x);
无法编译,因为 char *
与 int32_t
不同(并且不可转换)。
C++ 被设计为编译 语言。这意味着语言规范要求的任何检查都由编译器在编译时执行。此类检查所需的一切都由编译器存储在编译器的内部数据结构中。这些数据结构仅在编译期间存在。
一旦C++代码成功编译成可执行代码,所有检查就完成了。不再存储任何内容。不再检查任何内容。
换句话说,C++ 语言中的类型安全检查是静态的。
此原则的唯一例外是 dynamic_cast
的功能,它可以执行某些 运行 时间(动态)类型检查。为此,确实需要存储一些 运行 时间类型信息 (RTTI)。通过typeid
,相同的数据用于运行-时间类型识别。但这是一个单独的主题,它并没有真正覆盖 C++ 中的一般类型检查本质上是 static 的事实。