我理解的是,C++ reinterpret_cast 和 C 指针转换只是编译时的功能,并且完全没有性能成本。
这是真的吗?
这是真的吗?
这是一个很好的假设。然而,当存在reinterpret_cast<>
或C指针转换时,优化器可能会受到限制,无法做出假设。尽管类型转换本身没有任何关联指令,但是最终生成的代码会变慢。
例如,如果你将一个整数转换为指针,优化器可能不知道该指针指向什么。结果就是,它可能会假设通过该指针的写操作可以更改任何变量。这比常见的优化,如在寄存器中存储变量,要慢。
没错。除了在新宽度执行指令时可能会有的性能收益/损失外,没有其他成本。我可以补充一下,这种情况只在极少数情况下才会出现。在我听说过的所有平台上,指针之间的转换都是零成本的,不会对性能产生任何影响。
是的,这是真的。在运行时会产生成本的转换类型是 dynamic_cast。
static_cast
可能会有运行时的成本,虽然通常只是一个指针调整或将一种类型转换为另一种类型的代码(例如将int
转换为float
)。 - Billy ONealstatic_cast
不也会调用用户定义的类型转换吗?而这样做的运行时成本是不可预测的。 - Ben Voigt你说得没错,但是要考虑一下:reinterpret_cast可能意味着设计有问题或者你正在做非常底层的事情。
而dynamic_cast则会有一些开销,因为它需要在运行时查找查找表。
dynamic_cast
更类似于带有运行时检查的 static_cast
,而不是 reinterpret_cast
。你不能使用 reinterpret_cast
转换多态类型。 - Billy ONealreinterpret_cast
不会产生运行时开销.. 但是你必须小心,因为每次使用reinterpret_cast
都是实现定义的。例如,将一个char
数组重新解释为一个int
数组可能会导致目标架构抛出中断,因为不同类型可能具有不同的对齐规则。
先保证正确性,然后再考虑效率。
我之前在查看我的汇编代码,使用重新解释将有符号字符转换为无符号字符后,指令的数量增加了大约3或4个。
int main()
{
signed char i = 0x80;
(unsigned char&)i >>= 7;
return i;
}
float *
写入,然后通过int *
读取,则优化器通常可以重新排序两个语句。写入不会影响读取,因为类型不同。但是,如果在int*
和float*
之间有先前的reinterpret_cast
,则优化器很可能会采取安全措施。 - MSaltersconst_cast
和reinterpret_cast
)。实际上,我不认为这会比单独使用reinterpret_cast
对优化器造成更大的阻碍。出于可读性的原因,请优先考虑使用reinterpret_cast
。C语言中的强制类型转换很难发现。 - MSalters