博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#未来新特性:静态委托和函数指针
阅读量:6496 次
发布时间:2019-06-24

本文共 1289 字,大约阅读时间需要 4 分钟。

C#每发布一次新版本,都会增加一些底层相关的新特性, 这些特性对大多数商业程序来说并没什么实际用处,主要用于那些对性能有很高要求的代码,如图形处理、机器学习以及数学工具包,等等。

接下来的两个提案,主要实现了新的引用类型和函数调用方式。

静态委托

C#中的普通委托是一种比较复杂的数据结构。它包含一个函数指针、一个针对this参数的对象引用(可选),以及一个指向委托链的链接。同其他引用类型变量相同,这个结构体也采用了堆分配方式,具有同样的内存压力。此外,在非托管代码中使用它时,需要进行组装。

与普通委托相比,静态委托就简单得多。它同样是一个结构体,但这个结构体只包含了一个IntPtr类型的函数指针。因此,静态委托是一种结构类型的变量,就是说不论在托管还是非托管代码中,它都具有相同的内存分布,在调用本机代码时也不需要进行组装了。

静态委托声明的语法如下:

static delegate int Func()

我们可以使用类似于的属性来指定其他设置,如字符集和调用约定。

静态委托也有一些使用限制,例如只能引用静态函数,不能引用对象的成员方法,因为没有可用于存储对象指针的内存空间。此外,静态委托不能链接到其他的委托。

在CLR(公共语言运行时)层,静态委托通过中间层指令calli(call indirect)来调用,而普通委托则通过中间层指令call或callvirt(call virtual)来调用。

为了实现代码的向后兼容性,本提案允许从静态委托隐式转换到普通委托。但普通委托到静态委托则只能依靠显式转换,因为并不是所有的普通委托都满足静态委托的要求。

你可以在GitHub上阅读更多有关的信息。

函数指针

函数指针则是另外一个比较有吸引力的新提案(我们姑且称它为,因为它实现了一个类似C++的指针标示符*)。这个提案同样使用了中间层指令calli(call indirect)和ldftn(load method pointer)。与静态委托一样,它也需要先有一个声明,只不过使用关键字funcptr替换了delegate:

funcptr int F1(int value);

当调用本机函数时,调用者首先要确定一个。而这将会影响栈中变量的排列次序,以及使用结束后该由调用者还是被调用者来负责清理栈。这个提案可使用的调用约定有cdecl、fastcall、stdcall、thiscall和winapi。开发者可以通过修改委托声明来指定所需要的调用约定:

funcptr cdecl int F1(int value);

在这个提案里,函数指针只能在非安全上下文中使用。

作为提案的一部分,你可以在函数名前面使用地址操作符(&)来生成一个函数指针。这个操作同样也只能在非安全上下文中使用。

函数指针的其他限制与静态委托相同。例如,它们只能引用静态函数,不能链接到其他委托等。

这两项提案目前都在讨论之中,还没有真正纳入C#的路线图。还有一个叫作Compiler Intrinsics的提案,但是因为有一些额外的限制,它被采用的可能性不是很高。

查看英文原文:

转载地址:http://lmuyo.baihongyu.com/

你可能感兴趣的文章
晨跑【最小费用最大流】
查看>>
景点中心 C组模拟赛
查看>>
iOS国际化(多语言设置)
查看>>
bzoj 2733 平衡树启发式合并
查看>>
sublime简书安装配置
查看>>
爱上MVC~Web.Config的Debug和Release版本介绍
查看>>
条款03 尽可能使用const
查看>>
【转】那些年我们一起清除过的浮动
查看>>
python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法...
查看>>
【每天一道算法题】时间复杂度为O(n)的排序
查看>>
NLog的介绍使用
查看>>
Haproxy+Rabbitmq中的问题
查看>>
字符串变量小议
查看>>
232. Implement Queue using Stacks
查看>>
Poj(1469),二分图最大匹配
查看>>
和菜鸟一起学linux之V4L2摄像头应用流程【转】
查看>>
spin_lock、spin_lock_irq、spin_lock_irqsave区别【转】
查看>>
删除 mac 垃圾桶内清除不掉的文件
查看>>
【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
查看>>
/bin/bash^M: bad interpreter: No such file or dire
查看>>