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++实现

 

posted @ 2022-03-20 22:59  chendaxian  阅读(212)  评论(0编辑  收藏  举报