reinterpret_cast是否比static_cast慢?

时间:2016-02-16 18:58:40

标签: c++ void-pointers reinterpret-cast static-cast

我比较了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); 有效的所有情况,似乎都是如此。

3 个答案:

答案 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<>慢。