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