C#unsafe指针与C++指针
今天闲来无事,研究起C#的Unsafe代码,很好奇为什么在操作图像数组的时候要用指针,明明c#也提供了类似p[i]这样的写法。下面说说我的看法,欢迎讨论
下面先介绍C#的
C#的的数组时引用类型,继承至Array类(因此才有Length等属性),所以他是一般情况下是分配在堆内存中的。
比如下面代码中,0到9是存储在堆中的,但array是定义在栈中的。
var array =new int[10]{0,1,2,3,4,5,6,7,8,9};
因此,C#中使用array[i]这样的代码会先从栈中读取地址,然后再在堆中访问数据。
而使用Unsafe代码采用指针,可以直接访问堆中的数据,只需要一次。
下面是测试代码,很简单。就是定义了10000*10000的byte数组,进行遍历看看消耗时间。
static void Main(string[] args) { NormalMethod(); UnsafeMethod(); Console.ReadLine(); } public static void NormalMethod() { byte[] bytes = new byte[10000 * 10000]; var t1 = DateTime.Now; for (int i = 0; i < bytes.Length; i++) { bytes[i] = 9; } var t2 = DateTime.Now; Console.WriteLine((t2 - t1).ToString()) ; } public static unsafe void UnsafeMethod() { var bytes = new byte[10000 * 10000]; var t1 = DateTime.Now; fixed (byte* p = bytes) { for (int i = 0; i < bytes.Length; i++) { p[i] = 9; } }; var t2 = DateTime.Now; Console.WriteLine((t2 - t1).ToString()); }
可以看到Unsafe指针的确快一点
再看看C++版本的:
unsigned char *bytes = new unsigned char[10000*10000]; clock_t start = clock(); for (size_t i = 0; i < 10000*10000; i++) { bytes[i] = 3; } clock_t end = clock(); std::cout << double(end - start) / CLOCKS_PER_SEC;
C++处理速度则快的多,怪不得对于性能要求高的一般用C++实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix