【问题标题】:How efficient is `typeof(expr)`?`typeof(expr)` 的效率如何?
【发布时间】:2015-09-06 06:02:19
【问题描述】:

typeof 在处理复杂表达式时的效率如何?

具体来说,分两种情况:

  • 完全由需要没有 CTFE 评估的常量部分组成的复杂表达式

  • 需要mixin() CTFE 字符串的复杂表达式。

我不知道这是否根本不同,但这是我关心的两种情况。

【问题讨论】:

  • 如果结果是一个结构,它在编译时被评估。我不确定如果涉及类和多态性会发生什么。我猜它要么在编译时进行评估,要么在有歧义的情况下归结为 d-runtime 中的简单查找。简而言之,它很有效。
  • @Tamas :无论多态性情况如何,我相信这都是 CT(它只返回最低的基类)。 RT 多态性使用typeid 代替。我关心的是 typeof 如何处理可能需要 CTFE 或依赖其他多路径编译时反射算法的表达式(例如使用 __traits)。 仍然是 CT 操作,但我想知道在编译时这样做的效率如何。
  • typeof 不评估它的论点;除非表达式使用使用它们的模板,否则不会有任何 CTFE 或 mixin 语句需要计算。

标签: d ctfe


【解决方案1】:

这取决于您是否对运行时效率或编译时效率感兴趣。 typeof(expr) 的运行时开销为零,它在编译时被完全评估。

编译时间复杂度很低,一般不用担心。

【讨论】:

  • 我知道这完全是一个编译时操作(因为 D 是静态类型的)。但 D 也有 mixins 以及其他复杂的 CT 反射工具。我的问题:那些获得typeof 结果的时间是否更长,或者导致非混合表达式也比 typeof 更慢,以解释由于 mixins/CT-reflected-generated-code 导致的复杂性增加?
  • 只有当 mixin 表达式实际出现在 typeof 中时才需要对其进行求值......那么它可以像那样慢,但否则类型都是已知的。甚至像 func 返回 auto 的 typeof(func()) 大多数时候都很容易计算 - 它只查看第一个 return 语句的类型(可能已经知道并缓存,除非这是第一次实例化它),这很容易。 typeof(a+b) 查找 a 和 b 上的字段,然后获取它们的共同类型,这是一个简短的 if/else 系列。这么快。只有 mixin(str) 真的可以减慢速度。
  • 再一次,字符串只是数组,将很快被处理。
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多