我编写了越来越多的 C 应用程序,现在我想知道关于强制转换的一些事情。在 C++ 中,动态转换是一项非常昂贵的操作(例如向下转换),但我什至不知道静态转换。
在 C 中,我不得不写这样的东西:
assert ( p ); /* p is void* */
int v = *(int*)p;
它是“C 动态转换”吗?static_cast<int*>(p)
它与C++的完全一样吗?它要多少钱?
提前致谢。
C 中的强制转换仅在编译时才有意义,因为它告诉编译器您希望如何操作一段数据。它不会改变数据的实际值。例如,(int*)p
告诉编译器将p
整数视为内存地址。然而,这在运行时没有任何成本,处理器只是按照给它的方式处理原始数字。
指针的 AC 转换更像是 C++ reinterpret_cast
。它指示编译器将变量视为不同类型,并且在运行时不花费任何成本。
AC cast 更像所有 C++ 风格的强制转换,除了 dynamic_cast
组合。因此,当您将 int 转换为另一个整数类型时,它是static_cast
. 当您将指针转换为其他指针类型或整数类型或反之亦然时,它是reinterpret_cast
. 如果你扔掉一个const
,它就是const_cast
。
C 没有类似的东西,dynamic_cast
因为它具有对象类型的概念,并且也不会像 C++ 那样对它们有用(没有虚函数......)。关于解释对象位的类型只有在与 C 中引用对象的表达式结合时才变得重要。对象本身没有类型。
指针是指针 - 转换指针是一个 noop。
之前是内存地址,之后是内存地址。
它本质上是一个声明“让我们假设这是一个指向类型 x 的指针,以便将来进行类型检查”。
因此,您可以reinterpret_cast
根据 C++ 将其称为 a,因为它不会像eg或 a那样执行额外的编译时类型检查。dynamic_cast
static_cast
我不认为 C 具有dynamic_cast
(“在此处插入运行时类型检查”)或static_cast
(“在此处执行额外的编译时类型检查”)的等价物。
请注意,对于非指针,事情的行为会略有不同。
int b = 1;
double a = (double) b;
与其说是强制转换,不如说是显式类型转换。