【锁定直播】字节、华为云、阿里云等技术专家讨论如何将大模型接入 AIOps 解决实际问题,戳>>> 了解详情
写点什么

C#的未来:托管指针

  • 2015-05-05
  • 本文字数:1388 字

    阅读完需:约 5 分钟

对于许多开发者,尤其是编写游戏软件,以及进行纯数字计算的开发者来说,原始性能是程序的重中之重。同时对他们来说,最大的问题莫过于内存分配了。虽然分配操作本身消耗很小,但过多的分配会造成内存的极大压力,并且造成垃圾回收器的执行周期更加频繁。

在堆中分配的内存也会造成缓存的问题。如果你有一个存放引用类型的列表或是数组,它的实际数据与数组本身是分开进行保存的。这意味着你可能不得不浪费更多的缓存线以保存这个数组以及由数组所引用的对象。而如果我们在同一时间内创建了这些对象,那么可能会造成很大的分散性,进而导致消耗更多的缓存线。相关数据的分散性也就导致了糟糕的局部性(locality)。

使用值类型(在 C#的说法中也就是结构体)能够极大地减少内存的分配次数并改善局部性。但是,在结构体的使用上存在着一些限制。因为设计它们的初衷是传递拷贝,因此你必须保证它们的尺寸非常小,否则就很可能受到性能上的严惩,这也违背了在第一时间使用值类型的本意。

为了避免无意义的拷贝,一种做法是在将值类型传递给函数时使用一个托管指针。目前为止,唯一一种能够在 C#中创建托管指针的做法是在参数前使用“ref”关键字。这种做法确实能够应对某些场景的性能问题,但实际上 CLR 通过托管指针能够实现的功能远不止这些。

Ref 返回值与 Ref 本地变量这条提议中,提出了另外两种能够为 C#程序员所用的选项。

Ref 本地变量

假设有一个 int 类型的本地变量 a,这条提议允许你通过以下语法创建一个 Ref 本地变量:

ref int x = a;

类似于 ref 参数,ref 本地变量本质上就是它所指代的本地变量的某个别名而已,这种方式使你不必再生成它的拷贝。你也可以通过这种语法创建一个指向某个数组元素、或指向另一个对象的某个字段的指针。

ref int y = b[2];
ref int z = c.d;

在 CLR 术语中,Ref 本地变量被称为一个“TypedReference”(类型化引用)。一个 TypedReference 包含了指向某个地址的指针,同时也包含了该地址所能够存放的数据的类型信息。

按规定,一个 TypedReference 必须是一个参数或本地变量。这一规定是因为 CLR 不允许堆中的元素指向其它元素的内部。你也无法返回一个 TypedReference 对象,否则你就可以返回一个对本地对象的引用,而这个对象在函数结束后自然是已经不存在了。

Ref 返回值

这条提议的第二部分允许你在函数中返回 ref 引用,这就使以下场景变得可能:

public static ref TValue Choose(
Func condition, ref TValue left, ref TValue right)
{
return condition() ? ref left : ref right;
}
Matrix3D left = […], right = […];
Choose(chooser, ref left, ref right).M20 = 1.0;

通过使用这种新语法,以上的示例代码就不会对结构体进行任何拷贝操作,而是创建托管指针并在方法调用中进行传递。

与 ref 本地变量不同,要实现这一特性或许必须对 CLR 标准进行改动。正如之前所说,通常来说是不允许返回 TypedReference 对象的。从技术上讲你可以这么做,但这种操作不是类型安全的,其结果也是“无法检验的”。在受限安全设置中,使用未经检验的代码是不允许的,因为它可能会引起严重的 bug,因此一般只在 C 与 C++ 中使用。

为了缓解这一风险,这条提议中也表示,你所返回的引用必须指向堆中的某个对象,或是指向某个已经存在的 ref 或 out 参数。换句话说,编译器将强迫你不能够返回某个指向本地变量的引用。

查看英文原文: C# Futures: Managed Pointers

2015-05-05 09:572699
用户头像

发布了 428 篇内容, 共 171.8 次阅读, 收获喜欢 38 次。

关注

评论

发布
暂无评论
发现更多内容

dapp智能合约链游开发公司、链游开发,链游源码出售,基于Dapp合约的链上游戏

西安链酷科技

DAPP系统开发

IoT与鸿蒙、低代码、生成式AI,引爆技术浪潮——华为云开发者日南京站成功举办

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 华为云开发者日

低代码,程序员提高生产力的开发工具

互联网工科生

低代码开发 JNPF

《完蛋!我被美女包围了》突然火了!世界首个开源贡献榜出炉丨 RTE 开发者日报 Vol.75

声网

打字练习软件 Type Fu mac v4.8.0中文直装版

mac

苹果mac Windows软件 打字练习软件 Type Fu

软件测试/测试开发丨利用ChatGPT自动生成架构图

测试人

人工智能 软件测试 ChatGPT

为什么需要对特权账号进行管理

尚思卓越

运维 网络安全 信息安全

基于eBPF的云原生可观测实践

谐云

GameFi 游戏 NFT 链游开发系统搭建技术

西安链酷科技

gamefi NFT链游

外贸网站建设攻略:如何建设一个高效的外贸网站

九凌网络

在线涂鸦画板软件哪款好?这7款涂鸦神器值得推荐!

彭宏豪95

效率工具 画图软件 在线白板 涂鸦 绘画软件

低代码可视化平台 快速搭建油库2D组态管理平台

2D3D前端可视化开发

物联网 可视化 组态软件 组态工具 智慧油库

如何利用 NFTScan NFT API 在 Aptos 网络上进行 Web3 应用程序开发

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 链游开发 NFT开发

SketchUp 2019 for Mac(草图大师) v19.1.173中文激活版

mac

草图大师 苹果mac Windows软件 SketchUp 2019 3D设计软件

pi币商城开发 公链项目开发 dapp开发公司

西安链酷科技

公链开发

语音识别技术在医疗健康领域的应用与挑战

来自四九城儿

2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金, 现在有一位小偷计划从这些房屋中窃取现金, 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋, 小

福大大架构师每日一题

福大大架构师每日一题

Illustrator 2023最新中文破解版 附破解补丁 完美支持M1

晴雯哥

自动化混沌工程 ChaosMeta V0.6 版本发布

ChaosMeta

云原生 自动化 稳定性 混沌工程 攻防演练

量化交易软件市值管理开发公司

西安链酷科技

量化交易系统

2023年度openEuler领先商业实践遴选征集工作正式启动

彭飞

特权账号管理系统PAM的优势特点

尚思卓越

网络安全 数据安全 PAM

高能有料 | 第二届OpenHarmony技术大会议程速递

OpenHarmony开发者

云桌面是否可以运行3D软件

青椒云云电脑

桌面云 云桌面

语音识别技术在智能客服领域的应用与优化

来自四九城儿

低代码PAAS加速推进企业数字化转型

力软低代码开发平台

低代码 信息化 PaaS平台

语音识别技术在智能家居领域的创新应用与挑战

来自四九城儿

特权账号安全管理的难点

尚思卓越

网络安全 数据安全 特权账号管理

Evolving with AR9582: MFC900M - A Legacy of Connectivity and Adaptation

wallyslilly

AR9582

HarmonyOS数据管理与应用数据持久化(一)

HarmonyOS开发者

软件测试/测试开发丨如何利用ChatGPT完善简历

测试人

人工智能 软件测试 ChatGPT

C#的未来:托管指针_.NET_Jonathan Allen_InfoQ精选文章