【发布时间】:2015-08-21 00:22:42
【问题描述】:
类型安全在 C++ 中是一件大事。不支持隐式转换的不同类型的变量不能设置为相等。 如何执行此安全检查? 除了变量本身,还有一些关于为该变量存储的类型的信息吗?
【问题讨论】:
标签: c++ type-safety
类型安全在 C++ 中是一件大事。不支持隐式转换的不同类型的变量不能设置为相等。 如何执行此安全检查? 除了变量本身,还有一些关于为该变量存储的类型的信息吗?
【问题讨论】:
标签: c++ type-safety
变量本身不包含有关它所包含内容的任何信息。相反,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 并返回double 和y 是double。由于所有这些都排成一行,因此无需转换,并且可以成功编译。相比之下:
char* x = "12";
double y = convert(x);
无法编译,因为 char * 与 int32_t 不同(并且不可转换)。
【讨论】:
C++ 被设计为一种编译 语言。这意味着编译器在编译时执行语言规范所需的任何检查。此类检查所需的一切都由编译器存储在编译器的内部数据结构中。这些数据结构仅在编译期间存在。
一旦 C++ 代码成功编译为可执行代码,所有检查就完成了。不再存储任何内容。不再检查任何内容。
换句话说,C++ 语言中的类型安全检查是静态的。
这个原则的唯一例外是dynamic_cast 的功能,它可以执行某些运行时(动态)类型检查。为此,确实需要存储一些运行时类型信息(RTTI)。相同的数据通过typeid 用于运行时类型识别。但这是一个单独的主题,它并没有真正覆盖 C++ 中的通用类型检查本质上是静态这一事实。
【讨论】: