【发布时间】:2012-03-31 09:01:45
【问题描述】:
documentation 声明:
函数 f 上的 {-# INLINABLE f #-} pragma 具有以下行为:
当 INLINE 表示“请内联我”时,INLINABLE 表示“随意内联我;请自行决定”。换句话说,选择权留给了 GHC,它使用与 pragma-free 函数相同的规则。与 INLINE 不同,该决定是在调用站点做出的,因此会受到内联阈值、优化级别等的影响。
与 INLINE 一样,INLINABLE pragma 保留原始 RHS 的副本以用于内联目的,并将其保留在接口文件中,而不管 RHS 的大小。
使用 INLINABLE 的一种方法是与特殊函数 inline 结合使用(第 7.18 节,“特殊内置函数”)。调用 inline f 非常努力地内联 f。为了确保 f 可以内联,最好将 f 的定义标记为 INLINABLE,以便 GHC 保证无论它有多大都会暴露展开。此外,通过将 f 注释为 INLINABLE,您可以确保 f 的原始 RHS 是内联的,而不是 f GHC 优化器生成的任何随机优化版本。
INLINABLE pragma 也适用于 SPECIALISE:如果您将函数 f 标记为 INLINABLE,那么您随后可以在另一个模块中进行 SPECIALIZE(参见第 7.16.8 节,“SPECIALIZE pragma”)。
与 INLINE 不同,可以在递归函数上使用 INLINABLE pragma。这样做的主要原因是允许以后使用 SPECIALISE
它有什么缺点?
它会使接口文件变得更大、更大吗?它会使编译速度变慢吗?
我有什么理由不应该在我编写的每个导出函数上加上一个 INLINABLE 编译指示? GHC 是否有任何理由不在我编写的每个导出函数上放置一个 INLINABLE pragma?
【问题讨论】: