10

我编写了越来越多的 C 应用程序,现在我想知道关于强制转换的一些事情。在 C++ 中,动态转换是一项非常昂贵的操作(例如向下转换),但我什至不知道静态转换。

在 C 中,我不得不写这样的东西:

assert ( p ); /* p is void* */
int v = *(int*)p;

它是“C 动态转换”吗?static_cast<int*>(p)它与C++的完全一样吗?它要多少钱?

提前致谢。

4

4 回答 4

8

C 中的强制转换仅在编译时才有意义,因为它告诉编译器您希望如何操作一段数据。它不会改变数据的实际值。例如,(int*)p告诉编译器将p整数视为内存地址。然而,这在运行时没有任何成本,处理器只是按照给它的方式处理原始数字。

于 2012-12-06T14:53:46.010 回答
7

指针的 AC 转换更像是 C++ reinterpret_cast。它指示编译器将变量视为不同类型,并且在运行时不花费任何成本。

于 2012-12-06T14:52:02.733 回答
6

AC cast 更像所有 C++ 风格的强制转换,除了 dynamic_cast组合。因此,当您将 int 转换为另一个整数类型时,它是static_cast. 当您将指针转换为其他指针类型或整数类型或反之亦然时,它是reinterpret_cast. 如果你扔掉一个const,它就是const_cast

C 没有类似的东西,dynamic_cast因为它具有对象类型的概念,并且也不会像 C++ 那样对它们有用(没有虚函数......)。关于解释对象位的类型只有在与 C 中引用对象的表达式结合时才变得重要。对象本身没有类型。

于 2012-12-06T14:59:59.897 回答
2

指针是指针 - 转换指针是一个 noop。

之前是内存地址,之后是内存地址。

它本质上是一个声明“让我们假设这是一个指向类型 x 的指针,以便将来进行类型检查”。

因此,您可以reinterpret_cast根据 C++ 将其称为 a,因为它不会像eg或 a那样执行额外的编译时类型检查。dynamic_caststatic_cast

我不认为 C 具有dynamic_cast(“在此处插入运行时类型检查”)或static_cast(“在此处执行额外的编译时类型检查”)的等价物。

请注意,对于非指针,事情的行为会略有不同。

int b = 1;
double a = (double) b;

与其说是强制转换,不如说是显式类型转换

于 2012-12-06T14:54:30.177 回答