QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

评论 1 条评论

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

一篇教你代码同步 Github 和 Gitee

冴羽

JavaScript GitHub 自己搭建博客网站 GitHub Pages vuepress

【Spring Boot 快速入门】三、Spring Boot集成JUnit

小阿杰

SpringBoot 2 JUnit 内容合集 签约计划第二季

【Spring Boot 快速入门】四、Spring Boot集成Swagger UI

小阿杰

SpringBoot 2 swagger 内容合集 签约计划第二季

完善跨境金融区块链服务平台,支持区域开放创新和特殊区域建设

CECBC

Explore the Sky丨来 TiDB Hackathon 2021 探索无限可能

PingCAP

Go 数据库 hackathon TiDB database

Apache Log4j 2 安全漏洞扫描及启示录

极狐GitLab

gitlab 安全 供应链 漏洞扫描 Apache Log4j 2

京东云PostgreSQL在GIS场景的应用分享

京东科技开发者

Istio在Rainbond Service Mesh体系下的落地实践

北京好雨科技有限公司

istio PaaS rainbond

最好用的七大顶级 API 接口测试工具

蒋川

API 测试工具

ClickHouse在工业互联网场景的OLAP平台建设实践

京东科技开发者

SD-WAN、SASE 和多云空间的未来趋势

devpoint

5G SD-WAN sase 12月日更

【Spring Boot 快速入门】二、Spring Boot集成MyBatis可以连接数据库啦!

小阿杰

SpringBoot 2 mybatis配置 内容合集 签约计划第二季

【Spring Boot 快速入门】五、Spring Boot集成Lombok

小阿杰

SpringBoot 2 lombok 内容合集 签约计划第二季

多点 DMALL x StarRocks:实现存储引擎的收敛,保障高查询并发及低延迟要求

StarRocks

数据库 数据分析 高并发 StarRocks

潮玩盲盒一番赏盲盒星球app专业源码搭建

风行无疆

Go 语言快速入门指南:第一篇 介绍

宇宙之一粟

Go golang 编程入门 签约计划第二季 12月日更

【Spring Boot 快速入门】一、周末建立了Spring Boot专栏,欢迎学习交流

小阿杰

SpringBoot 2 spring Boot Starter 内容合集 签约计划第二季

京东云ClickHouse和ES双引擎设计在零售选品中的应用实践

京东科技开发者

国产分布式数据库StarDB核心技术大揭秘二:智能运维管控

京东科技开发者

一周信创舆情观察(12.6~12.12)

统小信uos

点击下载 | 世界经济论坛全新推出深度AI洞察报告

澳鹏Appen

人工智能 机器学习 深度学习

分布式架构与性能优化

高性能架构探索

分布式 微服务 性能优化 内容合集 签约计划第二季

百度王海峰:深耕自然语言处理近30年,推进AI融合创新

百度开发者中心

自然语言处理

滨海中小企业协会参加新区工商联(总商会)第四次代表大会

InfoQ 天津

行业分析| 泛娱乐应用出海探索

anyRTC开发者

音视频 语音通话 视频直播 视频通话 泛娱乐

记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑

汪子熙

JavaScript ajax 跨域 28天写作 12月日更

国产分布式数据库StarDB核心技术大揭秘一:内核分解之数据分片

京东科技开发者

Android C++系列:Linux Socket编程(三)CS模型示例

轻口味

28天写作 12月日更

优秀的代码的分层结构

xcbeyond

架构 28天写作 12月日更

Rainbond 5.5 发布,支持Istio和扩展第三方Service Mesh框架

北京好雨科技有限公司

istio PaaS rainbond

探探的IM长连接技术实践:技术选型、架构设计、性能优化

JackJiang

网络编程 websocket 即时通讯 IM

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