在C语言中,类型转换变量的性能开销是多少?

15

我看到很多人建议在高性能应用程序中尽可能避免变量的数据类型转换。我从未理解为什么要这样做,通常我会进行很多次变量类型转换,主要是为了避免编译器警告。这对性能有任何影响吗?

常见的代码:

1)将struct X * 转换成 void * 后传递给函数。

2)将uint16_t 类型转换成 uint32_t


在编程中也要考虑汇编语言,例如在x86中,将uint16_t分配给uint32_t。现在我依稀记得,移动指令需要将上面的2个字节清零。那么这会带来什么开销呢? - deadbeef
1
不同类型的指针并不受限于相等大小。 - Eugene Sh.
1
@barakmanos 如果您能将其整合成一个答案 - 社区将不胜感激 :) 我太懒了.. - Eugene Sh.
2
我经常进行类型转换,主要是为了避免编译器警告。但这样做是错误的。这只是掩盖真正问题的表面现象。你可以这样想:编写编译器的人花费了额外的时间来告诉你他们认为你所做的事情是可疑的。不要忽视这一点——他们比你更了解将代码转换为可运行二进制文件的方法。 - Andrew Henle
这不是关于性能的问题,而是让编译器帮助你找到错误。因此:仅当 1)没有其他方法 - 考虑所有方面,并且 2)您完全理解 所有 影响 3)您完全接受它们时才进行类型转换。 - too honest for this site
显示剩余9条评论
1个回答

20
【关于强制类型转换】对性能有影响吗?
并没有直接的影响。类型转换是指一个值从一种数据类型显式地转换成另一种数据类型。实际上,可能会导致性能影响的是这种转换操作,而如果无论您是否进行强制类型转换都要执行这种转换,那么强制类型转换就不会对性能产生任何影响。
例如,有些编译器可以设置警告,指出从浮点类型到整数类型的隐式转换,通常这些警告可以通过使用强制类型转换来消除。这并不改变转换将被执行的事实,这种转换是不免费的,但是强制类型转换并不会使得转换比其本身更加耗费资源。
此外,某些转换可以免费实现。例如,在大多数机器上,具有相同宽度的带符号和无符号整数类型具有兼容的表示形式,因此在这些类型之间转换是无操作的,只添加或删除类型限定符的强制类型转换也属于此类。
针对您提到的特定案例:
1) 将struct X *传递给需要 void * 的函数
C语言不要求不同指针类型具有兼容的表示形式,但在实践中,不同的对象指针类型通常具有相同的表示形式。因此,指针类型之间的转换通常是免费的。无论如何,在您提到的情况下,无论您是否插入显式强制类型转换,都将执行此转换。
2) uint16_t 转换为 uint32_t

根据具体情况和编译器实现,这可能是免费的。例如,如果要转换的值已经保存在32位寄存器中,则不需要执行任何操作。此外,编译器可能能够在特定表达式中将其实现为无操作。请注意,如果 uint32_t 与常见的 unsigned int 相同,那么C语义要求在算术表达式的评估中例行执行此特定转换,因此许多这些属于无论您是否进行强制转换都会发生的转换类别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接