我的理解是C ++ reinterpret_cast和C指针强制转换是公正的 一个编译时功能,它根本没有性能成本。
这是真的吗?
答案 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 倍。现在我担心选角是主要因素之一。
这是讽刺,因为我们使用重新解释转换来提高速度。