reinterpret_cast演员费用

时间:2010-08-26 12:57:01

标签: c++ c reinterpret-cast

我的理解是C ++ reinterpret_cast和C指针强制转换是公正的 一个编译时功能,它根本没有性能成本。

这是真的吗?

7 个答案:

答案 0 :(得分:56)

这是一个很好的假设。但是,在存在reinterpret_cast<>或C指针强制转换的情况下,优化器可能会受到限制。然后,即使演员本身没有相关的指令,结果代码也会变慢。

例如,如果将int转换为指针,优化器可能不知道指针指向的是什么。因此,它可能必须假设通过该指针的写入可以更改任何变量。这超过了非常常见的优化,例如将变量存储在寄存器中。

答案 1 :(得分:6)

没错。除了在新宽度上执行指令的性能增益/损失之外,没有任何费用,我可以补充说,在极少数情况下只是一个问题。在我听说过的每个平台上的指针之间进行投射都没有成本,也没有任何性能变化。

答案 2 :(得分:5)

C ++中的C样式转换将首先尝试static_cast,如果无法执行静态转换,则仅执行reinterpret_cast。 static_cast可以在多重继承的情况下(或者在将接口转换为具体类型时)更改指针的值,此偏移计算可能涉及额外的机器指令。这最多只能是1台机器指令,所以非常小。

答案 3 :(得分:1)

是的,这是真的。具有运行时成本的转换类型是dynamic_cast。

答案 4 :(得分:1)

你是对的,但想一想:reinterpret_cast意味着可能是一个糟糕的设计,或者你做的事情很低。

动态转换它会花费你一些东西,因为它必须在运行时查看查找表。

答案 5 :(得分:1)

reinterpret_cast不会产生运行时成本..但是您必须小心,因为reinterpret_cast的每次使用都是实现定义的。例如,有可能重新解释char数组,因为int数组可能导致目标体系结构抛出中断,因为不同的类型可能有不同的对齐规则。

首先获得正确,然后担心效率。

答案 6 :(得分:0)

在将有符号字符重新解释为无符号字符之前和之后,我都在查看我的汇编代码。指令增加了大约 3 或 4 条指令。

int main()
{
 signed char i = 0x80;
 (unsigned char&)i >>= 7;
 return i;
}

我正在转换为 unsigned char 以使编译器使用 SHL 指令,而不是 SAR 指令,这样新移位的位将是 zer0s 而不是 var i 有符号位值。

编译器仍然并且似乎总是使用 SAR 指令。但是重新解释转换使编译器添加了更多指令。还有 3 到 4 条说明!

我担心为什么我的用于将 UTF8 转换为 UTF16 字符串的 unicode 函数比 Win32 MultiByteToWideChar() 慢了近 3 倍。现在我担心选角是主要因素之一。

这是讽刺,因为我们使用重新解释转换来提高速度。