F#特殊引号?(##)

12
我刚刚看到了这个链接:http://frankniemeyer.blogspot.com/2010/04/minimalistic-native-64-bit-array.html,里面包含以下内容:
(# "sizeof !0" type('T) : nativeint #)

我相信技术术语是“什么鬼?”我在我的F#编程(约8个月)中从未遇到过类似的东西... FSI告诉我一些关于弃用结构的信息,仅用于F# libs...而且谷歌上搜索(#)好像没有什么作用。有什么建议吗?

3
我认为这是 F# 核心库内联发出 IL 的方式。 - ildjarn
3个回答

8
这是内联IL发射的表示法。它曾经在F#早期是一个更为突出的特性,但已被弃用。来自F#团队的一位名叫Brian的绅士指出,它目前主要用于引导F#编译器,并且该团队打算将此结构标记为错误而不仅仅是警告。
请看他在这里发布的完整故事。

4

这是内联IL(中间语言)代码。F#团队在实现F#核心库的部分功能时,使用了这种构造方式,因为没有其他方法可以完成。这段代码会产生一个警告,说它不应该用于除F#核心库之外的任何地方,所以你可能不需要太担心它,因为它不应该出现在生产代码中。


3

很有趣。但我认为F#已经为我们提供了所需的转换操作(对于这个特定的操作!),而不需要诉诸IL。

[<Unverifiable>]
let inline ArrayOffset (itemSize:int64) (length:int64) (start:int64) (idx:int64) = 
    if idx < 0L || idx >= length then raise(IndexOutOfRangeException())
    NativePtr.ofNativeInt(nativeint(start + (idx * itemSize)))

你说得没错,你可以那样做。但那会耗费一个IMUL;我真的想利用AGUs来进行地址生成部分,这就是我在那篇博客文章中使用丑陋的inline IL的原因。但请不要在生产代码中这样做。 - Frank
我并不是一个 MSIL-slinger,正如你所猜测的那样。这里肯定还涉及到乘法。IMUL 是什么意思? - Sebastian Good
你需要查看生成的机器代码才能了解正在发生什么。在你的情况下,JITter将不得不发出至少一个额外的整数移位指令(或乘法),以便为非字节数组按比例缩放地址。当你使用sizeof IL指令时,地址计算完全在CPU的地址生成单元中执行,并且不会阻塞整数流水线(单个mov指令)。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接