写点什么

C#未来新特性:静态委托和函数指针

  • 2019-02-13
  • 本文字数:1205 字

    阅读完需:约 4 分钟

C#未来新特性:静态委托和函数指针

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


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

静态委托

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


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


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


static delegate int Func()
复制代码


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


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


在 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 的提案,但是因为有一些额外的限制,它被采用的可能性不是很高。


查看英文原文:https://www.infoq.com/news/2019/02/CSharp-Static-Delegate


2019-02-13 08:006393

评论 1 条评论

发布
用户头像
感觉第一个更好一些
过多的引入新机制将使得C#更加复杂
2019-02-13 17:04
回复
没有更多了
发现更多内容

谈谈汽车芯片安全(下篇)

SOA开发者

直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码

Java 编程 架构 面试 程序人生

Redis可观测最佳实践,5大关键指标最全解析!

观测云

redis

一张图读懂Z-ONE Studio Lite

SOA开发者

冲破“薪资”瓶颈,某厂的玩转Java面试指南,他看完涨薪10k了!

Java 程序员 架构 编程语言

To B的软件产品死结怎么解?

刘华Kenneth

tob产品 客户服务

千万级学生管理系统的考试试卷存储方案

Geek_db27b5

华为云正式推出区块链服务!区块链技术将在数字经济时代大放异彩

CECBC

云计算科普:Pets(宠物)和Cattle(牲口)傻傻分不清楚?

刘华Kenneth

云计算 架构 云技术

一张图读懂Z-ONE Digital Car

SOA开发者平台

智能网联汽车安全架构系列1:ECU安全机制介绍

SOA开发者

腾讯云TDSQL-C云原生数据库技术

腾讯云数据库

数据库 tdsql

一张图读懂Z-ONE Digital Car

SOA开发者

2021字节跳动面试总监首发1121道LeetCode算法刷题笔记(含答案)

Java 面试 程序人生 计算机

双碳目标带来的机遇与挑战

石云升

新能源革命 碳中和 碳达峰 9月日更

拥抱云原生,华为云GaussDB全新助力金融行业数字化转型

华为云数据库小助手

GaussDB GaussDB(for openGauss) 华为云数据库

横空出世!复盘B站面试坑我最深的JDK源码剖析,全是干货!

Java 程序员 架构 架构师 计算机

软件定义汽车技术体系研究

SOA开发者

TDSQL数据同步和备份

腾讯云数据库

数据库 tdsql

架构作业 - 模块四 存储架构

Leo Zhao

架构训练营

“碳中和”的未来蓝图中,区块链所占据的重要位置

CECBC

斯图飞腾Stratifyd亮相Smart Retail,AI赋能零售新增长

金九银十已经过半还没拿到offer?阿里大牛熬夜整理的Java面试总结,网友已被震惊到说不出话!

Java 编程 面试 程序人生 金九银十

使用Tapdata一步搞定关系型数据库到MongoDB的战略迁移

tapdata

第4章-《Linux一学就会》- vim编辑器和恢复ext4下误删文件-Xmanager工具

学神来啦

vim Linux 运维 VI

“智感超清”之HDR技术落地实践

百度开发者中心

最佳实践 音视频

八月热点抢先看:EasyDL图像分割数据自动贴合标注,标注效率提升30倍+

百度大脑

人工智能

谈谈汽车芯片信息安全(上篇)

SOA开发者

北京建全球领先区块链算力平台,可满足未来各类场景需求

CECBC

浪潮云说丨浪潮云行·物联边缘云产品,让物联感知无微不至

云计算,

腾讯云TDSQL助力金融核心系统数字化转型

腾讯云数据库

数据库 tdsql

C#未来新特性:静态委托和函数指针_语言 & 开发_Jonathan Allen_InfoQ精选文章