我刚刚写了一些内联的数学实用函数,并且在测试时注意到
let quat = (3, 0, 0, 3)
(quat |||~||| quat)
|> ijk
|> printAn
完全折叠printAn (18, 0, 0)
,而开始时(3.0f, 0.0f, 0.0f, 3.0f)
仅插入原始值0.0f
和3.0f
常量值,而不评估任何浮点运算符,并且Tuple
实例化了一些 s(但几乎没有调试模式下那么多)。
(我使用针对 4.5 框架的 Visual Studio 2013 Update 4,使用默认Release
配置。取消定义TRACE
常量似乎没有什么区别,也没有open Unchecked
。)
我不太关心性能影响,因为如果它成为一个问题,应该很容易通过 IL 编织折叠表达式,但我仍然对编译器可以常量折叠的确切内容感兴趣。