【问题标题】:Do typecasts use conditionals internally? (C#, C/C++)类型转换是否在内部使用条件? (C#、C/C++)
【发布时间】:2013-05-06 04:06:44
【问题描述】:

这个问题是针对 C# 的,但了解 C/C++ 也会很有趣。我猜,Java 必须使用条件,因为它的动态类型转换/缺乏编译时泛型。

出于性能原因,最好在可能使用无分支逻辑的情况下避免分支。因此,为了避免在关键部分中可能出现的情况,了解这一点会很有趣。

【问题讨论】:

  • 嗯,在问它是否分支之前,先问一下总体上做了什么不是更有意义吗?更不用说你的前提是有问题的,你最好测量你关心的具体案例的性能。
  • 我指的是问题中的前提:出于性能原因,无分支实现更可取。请不要弄错“嗯”,我只是对你为什么要问这个特定的细节而不是关于整个强制转换的实现感到困惑。知道某物是否有分支很少能说明它的性能,就像知道某物有轮子并不能说明它的移动速度。如果您explained your actual problem,答案更有可能真正解决您的问题。
  • @delnan 我不需要解释任何问题。我问的是一个简单、笼统的问题,作为回报,我期待一个简单的答案。最终会有人给出这个答案。可能是具有语言/编译器设计经验的人。作为其他 SO 编程网站之一的前 10 名用户,我还要在这里指出,更多的问题应该不那么冗长。所以在我看来,这是一个典型的问题。
  • 对于 C++:static_castconst_castreinterpret_cast 可以在编译时解析。无需进行分支,尽管可能需要调用函数,如果不能内联相应的构造函数/强制转换运算符。除此之外,我认为对于如何实现本机类型之间的转换几乎没有保证。所以我想说类型转换的确切成本可能取决于特定的编译器(版本)、架构等。铸造是否有回报还取决于矢量化能力和其他东西。问题太笼统了(对于 C++)恕我直言。
  • 在 C# 中,许多不同类型的强制转换实际上具有相同的语法,但对于实现真正的强制转换来说,它真的很重要。在基本类型之间进行转换时,checked-mode 也很重要。

标签: c# c++ optimization conditional language-design


【解决方案1】:

这个问题是 C# 最具体的问题

不,不是。整个主题被故意排除在 C# 和 CIL 的规范之外。规范在这个问题上没有什么可说的。

您正在询问即时编译器的实现细节。

现在这个问题已经弄清楚了,我可以补充一点,我多年来一直阅读微软关于如何分析 CIL 以找到可以优化演员表的简单和复杂案例的技术文章。但是,微软在谈到实际实现时并没有详细说明他们的抖动。

所以你能做的最好的就是以优化器将编译它的方式编写一些测试代码,并查看不使用调试器时生成的机器代码。

【讨论】:

  • 显然有些人只是喜欢破坏问题。我猜是我在我的问题上告诉他们愚蠢的问题的人。
【解决方案2】:

当向下转换时,答案肯定是肯定的,因为它需要在每个级别都有多个选择的树下走。

向上转换时,它取决于迭代如何完成以向上遍历类型树。在大多数情况下,答案可能是肯定的,但是树上的一些优化(特别是它在内存中的布局)可能允许 walk-up 成为无分支操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2012-02-23
    • 2011-05-27
    相关资源
    最近更新 更多