写点什么

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:006193

评论 1 条评论

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

聪明人的训练(二十六)

Changing Lin

4月日更

教育是限制吗?

箭上有毒

4月日更

贝壳基于 Flink 的实时计算演进之路

Apache Flink

flink

硬核系列 | 手写脚本语言编译器

九叔(高翔龙)

Java 编译器 脚本语言 词法分析器 编译器原理

基于MySQL存储的自研消息队列架构设计文档

Geek_2e7dd7

近期值得关注的四款工具

彭宏豪95

效率 工具 Mac 4月日更

RocketMQ 在使用上的一些排坑和优化

AI乔治

Java 架构 分布式 RocketMQ 高并发

拍立淘创始人潘攀博士为你揭开“以图搜图”的神秘面纱!

博文视点Broadview

谁说 Java 不能用来跑 Serverless?

张晓辉

Java Serverless Knative Quarkus

阿里P8独家揭秘:短期内升职加薪的方法,到底是什么?

Java架构师迁哥

2021团体程序设计天梯赛-部分题解

玄兴梦影

算法 比赛 算法解析

2021金三银四最新拼多多 +蚂蚁金服 +头条(已拿offer),面试真题分享!

Java 编程 程序员 架构 面试

基于区块链技术的去中心化自治组织——核心属性、演进脉络与应用前景

CECBC

区块链

Java-技术专题-多线程顺序执行的8种方案实现

洛神灬殇

Java 并发编程 AQS 多线程 JUC

CloudIDE:为开发者写代码开启“加速”模式

华为云开发者联盟

开发者 代码 华为云 CloudIDE HDC2021

JVM类加载机制笔记

风翱

4月日更 JVM类加载

网络协议学习笔记 Day5

穿过生命散发芬芳

网络协议 4月日更

Rust从0到1-代码组织-路径

rust 路径 代码组织 paths

金三银四 Java 架构面试指南上线, 1000 余道大厂面试真题,送你上岸

Java 编程 程序员 架构 面试

【Node专题】Buffer理解

南吕

后端 nodejs 4月日更

应“云”而生的 Java 框架 Quarkus:构建小而快的镜像

张晓辉

Java Docker Serverless CloudNative Quarkus

怎么理解组织?

石云升

团队建设 28天写作 职场经验 管理经验 4月日更

Linux字符截取命令-cut

进击的梦清

Linux 运维 xshell

南京的春天

小天同学

随笔 4月日更 春天 南京 散文

Golang easyjson

escray

学习 极客时间 Go 语言 4月日更

连续三年入围 Gartner 容器竞争格局,阿里云容器服务新布局首次公开

阿里巴巴云原生

容器 运维 云原生 k8s 边缘计算

容器 & 服务: 扩容(二)

程序员架构进阶

容器 k8s 28天写作 弹性扩容 4月日更

MySQL 死锁套路:一次诡异的批量插入死锁问题分析

AI乔治

Java MySQL 架构

面向软件 IT 专业的高校大学生职业规划问卷调查

打工人!

IT 问卷调查 职业生涯规划

Python异常的这些知识点你都get到了吗?

老猿Python

Python 编程语言 异常处理

6 张图带你彻底搞懂分布式事务 XA 模式

阿里巴巴云原生

Java 数据库 云原生 存储

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