【问题标题】:performance overhead of typecasting variables in C [closed]C中类型转换变量的性能开销[关闭]
【发布时间】:2016-09-15 07:36:48
【问题描述】:

我看到有人建议在高性能应用程序中尽可能避免对变量进行类型转换。我从来不明白这是什么原因,我倾向于进行很多次类型转换,主要是为了避免编译器警告。这对性能有任何影响吗? 常见代码:

1) struct X * 传递给一个接受 void * 的函数

2)uint16_t 类型转换为uint32_t

【问题讨论】:

  • 类型转换主要在编译时完成(不确定定点到浮点,反之亦然,但最肯定的是指针类型),因此没有任何运行时影响。
  • 常识表明与浮点的转换需要一些 CPU 周期...
  • @barakmanos 指向不同类型的指针不限制大小相等。
  • @barakmanos 如果您可以将其整合为答案 - 社区将不胜感激 :) 我太懒了..
  • 我倾向于多次进行类型转换,主要是为了避免编译器警告。你做错了。那只是在掩盖实际问题。可以这样想:编写您用来将源代码转换为可运行二进制文件的编译器的人花了额外的时间告诉您,他们认为您正在做的事情很狡猾。不要忽视这一点——他们比你更了解将代码转换为可运行的二进制文件。

标签: c performance x86


【解决方案1】:

[casting] 对性能有影响吗?

不直接。类型转换表示值从一种数据类型到另一种数据类型的显式转换。确实是转换可能会对性能产生影响,如果无论您是否进行转换都将执行这种转换,那么转换对性能没有任何影响。

例如,某些编译器可以设置为警告从浮点类型到整数类型的隐式转换,并且通常可以通过使用强制转换使转换显式来消除这些警告。这不会改变将执行转换的事实,并且此类转换不是免费的,但演员表不会使转换比其他情况下更昂贵。

此外,一些转换可以免费实现。例如,在大多数机器上,具有相同宽度的有符号和无符号整数类型具有兼容的表示,因此在这些类型之间转换值是无操作的。仅添加或删除除 _Atomic 之外的类型限定符的强制转换也属于此类别。

关于你的具体例子:

1) struct X * 传递给一个接受 void * 的函数

C 不需要不同指针类型的兼容表示,但实际上,如今不同的对象指针类型具有不同的表示已经很少见了。因此,指针类型之间的转换通常是免费的。然而,这并不重要,因为您询问的特定情况是无论您是否插入显式强制转换都将执行转换的情况。

2) uint16_t 类型转换为 uint32_t

这可能是免费的,具体取决于具体情况和编译器实现。例如,如果要转换的值已经保存在 32 位寄存器中,则它是空操作。此外,编译器可能能够在它出现的特定表达式中将其实现为无操作。另请注意,如果uint32_tunsigned int 相同,这是常见的,那么 C 语义要求在计算算术表达式时常规执行此特定转换,因此其中许多属于无论您是否投射,都会发生的转化类别。

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多