我见过人们建议在高性能应用程序中尽可能避免对变量进行类型转换。我从来没有理解这个的原因,我倾向于大量的时间来避免编译器警告。这对性能有什么影响吗? 常见的代码:
1)struct X *
传递给一个带void *
2)uint16_t
类型转换为uint32_t
答案 0 :(得分:12)
[cast]对性能有任何影响吗?
不直接。类型转换表示从一种数据类型到另一种数据类型的值的显式转换。实际上转换可能会对性能产生影响,如果无论你是否进行转换都会进行转换,那么转换对性能没有影响。
例如,某些编译器可以设置为警告从浮点类型到整数类型的隐式转换,并且通常可以通过使用强制转换显式转换来使这些警告静音。这不会改变转换将被执行的事实,并且此类转换不是免费的,但是转换并不会使转换成本比原本更高。
此外,一些转换可以免费实施。例如,在大多数机器上,具有相同宽度的有符号和无符号整数类型具有兼容的表示,因此在这些类型之间转换值是无操作。仅添加或删除_Atomic
以外的类型限定符的强制转换也属于此类别。
关于你的具体例子:
1)
的函数struct X *
传递给一个带void *
C不需要针对不同指针类型的兼容表示,但实际上现在很少有不同的对象指针类型具有不同的表示。因此,指针类型之间的转换通常是免费的。然而,这几乎不重要,因为您询问的具体案例是,无论您是否插入明确的演员表,都将执行转换。
2)
uint16_t
类型转换为uint32_t
这可能是免费的,具体取决于具体情况和编译器实现。例如,如果要转换的值已经保存在32位寄存器中,那么它就是无操作。此外,编译器可能能够在其出现的特定表达式中将其实现为no-op。另请注意,如果uint32_t
与unsigned int
相同,那么C语义就要求在算术表达式的计算中执行例行这一特定转换,这么多这些都属于转换类别,无论你是否投射都会发生。