文档说明:
一个函数f上的{-# INLINABLE f #-} pragma具有以下行为:- 虽然INLINE表示“请内联我”,但INLINABLE表示“随意内联我;自行决定”。换句话说,选择留给了GHC,它使用与无编译指示函数相同的规则。与INLINE不同,该决策在调用点处做出,并因此受到内联阈值、优化级别等的影响。 - 与INLINE一样,INLINABLE pragma保留原始RHS的副本以进行内联,并将其持久化在接口文件中,而不管RHS的大小如何。 - 使用INLINABLE的一种方法是与特殊函数inline(第7.18节,“特殊内置函数”)结合使用。调用inline f会尝试非常努力地内联f。为确保f可以内联,最好将f的定义标记为INLINABLE,以便GHC保证公开展开,而不管它有多大。此外,通过将f注释为INLINABLE,您确保f的原始RHS被内联,而不是GHC优化器生成的任意随机优化版本。 - INLINABLE pragma也适用于SPECIALISE:如果将函数f标记为INLINABLE,则可以在另一个模块中后续使用SPECIALISE(参见第7.16.8节,“SPECIALIZE pragma”)。 - 与INLINE不同,在递归函数上使用INLINABLE pragma是可以的。这样做的主要原因是允许稍后使用SPECIALISE。
它的缺点是什么?
它会让接口文件变得非常大吗?编译速度会变得更慢吗?
我是否应该在我编写的每个导出函数上放置INLINABLE pragma? GHC为什么不在我编写的每个导出函数上放置INLINABLE pragma?
INLINABLE
的唯一劣势,与不使用它相比,就是会减慢编译时间或增加接口文件的大小? - Gabriella Gonzalez