static_cast
10,000项指针类型需要多少?
答案 0 :(得分:6)
其他答案指出,指针的成本为零;这是正确的,只要涉及具有单继承的类层次结构,但在处理多重继承时,可能会有(非常小的)成本。
在单继承类中,对象的内存布局通常被安排为使得指向派生类的指针可以用作指向基类的指针而不需要调整 - 这通常通过放置“父部分”来实现。前面的对象,因此指向Derived的指针实际上也是指向Base的有效指针。
但是在多继承场景中,你不能将所有基类放在对象前面;因此,在将Derived *
投射到Base1 *
或Base2 *
时,可能需要调整指针。当执行涉及指向其中一个基类的指针的各种操作时,这通常会导致指针的固定大小增量。
当然,这完全可以忽略不计(它最多相当于一条非常快速的汇编指令),但是,在这种情况下, 非常非常轻微的演员表。请注意,它并非特定于static_cast
,只要您需要将Derived *
视为Base2 *
(包括您只需调用Base2 *
方法时,就会出现此问题,因为{需要调整{1}}指针。)
补充阅读:http://www.codeproject.com/Articles/12935/What-static_cast-is-actually-doing
答案 1 :(得分:3)
没有,它是在编译时完成的,用于指针。但对于必须完成工作以在类型之间进行转换的实际对象而言,这不是零成本。当你static_cast一个指针时,你所做的就是以不同的方式查看地址。实际对象的转换可能涉及创建临时对象,因此具有用于创建它的转换运算符的运行时成本。
答案 2 :(得分:2)
施放应该花费0倍,无论多少次*
*在多继承场景中必须发生指针操作的指针有一个值得注意的例外,但是对于单继承的情况,static_cast正在允许代码以不同的方式对指针进行解引用:
以例如:
foo(void *x)
{
int * j=static_cast<int *>(x); // costs the same as void *x2=x;
// the cast above does nothing except allow the copy of the pointer value to j and allow the line below to work
int k = *j; // this would not be allowed directly from x without the static_cast
}
已将x
替换为多次继承并转换为基数,然后转换将指针移动到正确的基数开始。并没有成本。