报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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

评论 1 条评论

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

翻译:《实用的Python编程》08_01_Testing

codists

Python

Redis 最后一课

escray

redis 学习 极客时间 Redis 核心技术与实战 4月日更

Go1.16 中模块的新变化

Rayjun

Go 语言

一个DNS引发的“血案”

穿过生命散发芬芳

Wireshark 数据包分析 4月日更

Android音视频 - MediaCodec编解码音视频

LoveYFan

android 音视频 编解码

我的 2015-2018 —— 银行软开三年项目回顾

清秋

大前端 重构 鉴权 4月日更

一周信创舆情观察(3.29~4.4)

统小信uos

三翼鸟的羽翼下,人诗意地栖居在智能生活里

脑极体

微服务网关:Spring Cloud Gateway —— Zuul

程序员架构进阶

微服务 网关 28天写作 4月日更

那束漂亮的手捧花

小天同学

爱情 4月日更 幸福 传递

Github限时开放!阿里内部强推的《微服务容器化参考指南》简直太牛了!

Java架构之路

Java 程序员 架构 面试 编程语言

CIAM的7个基本原则

龙归科技

安全性 用户 业务增长

在业务高峰期拔掉服务器电源是一种怎样的体验?

冰河

分布式 微服务 数据恢复 MySQL 高可用 异常处理

Fl Studio真的不如Cubase或者Logic Pro等电音软件专业吗?

奈奈的杂社

编曲 电音 电音制作 中国电音 编曲宿主

经典递归

山@支

CI/CD之基于Jenkins的发布平台实践

小江

DevOps jenkins CI/CD 发布流程

线上PHP服务故障排查之路

风翱

PHP-FPM 线上事故 4月日更

聪明人的训练(九)

Changing Lin

4月日更

游戏数据埋点

data_y

游戏 数据埋点 游戏数据分析 埋点定义

【得物技术】算法入门一:算法的好坏?复杂度告诉你

得物技术

算法 时间复杂度 大前端 入门 复杂度

你真的懂反馈吗?

石云升

28天写作 职场经验 管理经验 4月日更

平面设计之PS(中)

空城机

PhotoShop ps 4月日更

新的物联网技术应用有哪些

cdhqyj

互联网 物联网 通信 计算机

Android音视频 - EGL源码解析以及C++实现

LoveYFan

android 音视频 OpenGL ES

新华三“云屏”发布:云屏融合重塑工作体验,全力构建智“会”时代

DT极客

JavaScript小笔记

赫鲁小夫

4月日更

浅论结构体与联合体

Integer

c

嘿,朋友!和你讲讲这15年来我的成长吧

亚马逊云科技 (Amazon Web Services)

调整云计算资源大小时要避免的10个错误

云计算

深入浅出 LVS 负载均衡系列(一):NAT、FULLNAT 模型原理

UCloud技术

负载均衡

AI 事件驱动场景 Serverless 实践

阿里巴巴云原生

人工智能 Serverless 容器 云原生 消息中间件

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