我比较了class typedef value_type
的两个指针,它们分别是T*
或char16_t
。
编译器抱怨我无法比较两者,因为它们是不同的类型:
'some_type1<char16_t>::value_type*' and 'some_type2<char16_t>::value_type*' lacks a cast
奇怪的是,我不能在{}之间static_cast<>
:
invalid static_cast from type 'some_type1<char16_t>::value_type*' to type 'char16_t*'
我是使用reinterpret_cast<>
比较static_cast<>
还是void*
reinterpret_cast<>
是否会产生影响?
我在某处读到reinterpret_cast<>
在运行时已完成,但我不确定。
更新
我的错误印象是static_cast<>
是在运行时完成的。通过进一步讨论,我现在明白它纯粹是一个编译时构造。
奇怪的是,它也被证明int
可以具有运行时成本,其中特定对象通过与构造函数匹配而被转换为另一个对象。
例如,您可以将原始static_cast<>
投射到具有static_cast<T>(e)
的矢量。对于startActivityForResult(activityBIntent, FORM_REQUEST_CODE);
有效的所有情况,似乎都是如此。
答案 0 :(得分:3)
即使不涉及自定义类型转换逻辑,static_cast
也可能具有(不明显的)运行时性能。这是因为在多重继承的情况下,static_cast
需要调整偏移到基数,这需要运行时算术。虽然效果微乎其微,但却存在。从以下代码示例中可以清楚地看出:
struct Mother {
virtual ~Mother();
virtual void mother();
};
struct Father {
virtual ~Father();
virtual void father();
};
struct Offspring: Mother, Father {
void mother();
void father();
};
void foo(Offspring* offspring) {
Mother* mother = offspring;
mother->mother();
}
函数foo()
的ASM代码包含以下内容:
movq %rax, -8(%rbp)
这是基础偏移量。如果你删除了演员表,你会看到这一行消失。
另一方面,reinterpret_cast
只是编译时的编译时间,在程序运行期间没有任何效果。
答案 1 :(得分:3)
reinterpret_cast<>
纯粹是编译时演员。您只是重新解释基础类型是什么,完全回避类型系统。没有可能的运行时方面。
static_cast<>
可以具有运行时成本,具体取决于您static_cast
的内容。如果您正在转换void*
,或者通过非多态对象层次结构,则不会有运行时成本。如果您正在通过多态对象层次结构进行转换,则由于vtable必须在运行时发生偏移更改。
如果你在一个层次结构之外进行投射,那么你必须实际创建一个新对象。这看起来像是调用转换函数:
struct A {
operator B() { /* something */ }
};
A a;
static_cast<B>(a);
或转换构造函数:
static_cast<std::vector<int>>(4);
static_cast<>
创建了一个全新的对象 - 所以肯定需要运行一些代码来执行此操作!
答案 2 :(得分:2)
我在某处读到
reinterpret_cast
在运行时完成但我不确定。
不,那是错的(来自你所拥有的那些来源)。
reinterpret_cast<>
和static_cast<>
都在编译时解析(从编译器错误中可以看出)。
static_cast<>
稍微慢于reinterpret_cast<>
,因为需要在发出的代码中插入针对基类的偏移量的一些计算。
您可能会对dynamic_cast<>
感到困惑,这确实是在运行时完成的,并且执行速度比reinterpret_cast<>
或static_cast<>
慢。