随笔 - 73  文章 - 1  评论 - 16  阅读 - 79594
  2024年11月21日
 
// C# pointer
unsafe void PointerUse(){
  int i=0;
  var pi=&i;  // 这是ok的
  Console.WriteLine("i={0}",i);
  pi[0] += 1;
  Console.WriteLine("i={0}",i);
  var x1=new object();
  var px1=&x1; // warn:CS8500
  Span<int> x2=[1,2,3];
  var px2=&x2;
  Span<int> x3=*px2;
  Console.WriteLine("px2[0]={0}",(*px2)[0]);
  (*px2)[0]+=100;
  Console.WriteLine("px2[0]={0}",(*px2)[0]);
  fixed(int* p=x2){
    p[0]+=100;
    p[2]+=5;
    // var p2=p+1;//指针+ - 数字还是指针
    // var p2=p+sizeof(int);
    var p2=p+1;
    // Console.WriteLine("p2:{0}",p2);
    *p2+=3;
    nint p3=(nint)p+sizeof(int);
    *(int*)p3-=1;
    ((int*)p3)[0]-=1;
    Console.WriteLine("p2:{0},x2:{1}",*p2,string.Join(",",x2.ToArray()));
  }
  Console.WriteLine("px2 convert to nint value:{0}",(nint)px2);
  Console.WriteLine("px2 convert to nuint value:{0}",(nuint)px2);
  //
  var x4=new int[]{1,2,3};
  int[]* px4=&x4;
  Console.WriteLine("px4[0][0]:{0}",px4[0][0]+=3);
  Console.WriteLine("px4[0][0]:{0}",px4[0][1]+=3);
  Console.WriteLine("px4[0][0]:{0}",px4[0][2]+=3);
  fixed( int* px4_1=&x4[0]){
  Console.WriteLine("px4_1[0]:{0}",px4_1[0]);
  Console.WriteLine("px4_1[1]:{0}",px4_1[1]);
  Console.WriteLine("px4_1[2]:{0}",px4_1[2]);
  }
  Console.WriteLine("*px4[0]:{0}",(*px4)[0]);
  Console.WriteLine("*px4[1]:{0}",(*px4)[1]);
  Console.WriteLine("*px4[2]:{0}",(*px4)[2]);
  Console.WriteLine("x4:{0}",string.Join(",",x4.ToArray()));
  (*px4)[0]+=1;
  Console.WriteLine("x4:{0}",string.Join(",",x4.ToArray()));
}

i=0
i=1
px2[0]=1
px2[0]=101
p2:3,x2:201,3,8
px2 convert to nint value:176251454976
px2 convert to nuint value:176251454976
px4[0][0]:4
px4[0][0]:5
px4[0][0]:6
px4_1[0]:4
px4_1[1]:5
px4_1[2]:6
*px4[0]:4
*px4[1]:5
*px4[2]:6
x4:4,5,6
x4:5,5,6

C#指针又学到两个新东西,注意避坑,分享 ,1: *t 和 t[0] 等价; 2: fixed 里 p[0]  == fixed 外的 p[0][0]亦即(*p)[0] ;fixed(T* p=arr)   外面只能写成 T*p=&arr;  3:  T* p;  p+=1 ; 相当于 (nint)p+=sizeof(T);  4: 对于通过nint/nuint来进行指针赋值的时候要这样写 "*(T*)nintValue " 这种写法可以赋值也可以取值

 

C# 指针冷知识: 1,T* p = &arr;  在fixed(T* p= arr){/*...*}  ;  2, *p 也可以写成 p[0]; 3, 与 nint/nuint 互相转换, p+=1; 相当于 (nint)p+=sizeof(T);

 

var p=new int[]{1,2,3}  ;  相当于  int[]* p=new int[]{1,2,3};  在fixed外,不能够 int* p=arr[0]; 要在fixed里面; 而 C#的 malloc 是 NativeMemory.Alloc(n); 从这里可以直接返回一个 void* 可以转成 任务指针, 象基础byte* 所以  byte* p 可以直接 p[i] 进行愉快的运算,而 若是 在 T[]* p 的话 需要先  p[0] 或 *p  再 索引 就是 p[0][i]  或(*p)[i] 有点烦索

posted @ 2024-11-21 22:43 ProjectDD 阅读(9) 评论(0) 推荐(0) 编辑
  2024年11月19日
摘要: 用于读写从基元类型到byte[]之间的映射; 不过这里指的基元类型主要是指各种数值类型; System.Buffers.Binary.BinaryPrimitives 结合 System.Runtime.InteropServices.MemoryMarshal System.Runtime.Com 阅读全文
posted @ 2024-11-19 16:07 ProjectDD 阅读(16) 评论(0) 推荐(0) 编辑
  2024年10月6日
摘要: [StructLayout(LayoutKind.Sequential)] unsafe struct B{ // public int field1; public double field2; public string field3; byte* field4; byte field5; ni 阅读全文
posted @ 2024-10-06 01:24 ProjectDD 阅读(33) 评论(0) 推荐(0) 编辑
  2024年2月2日
摘要: 这玩意儿不是强制的,已经测试了解, var x = from i in source ... 这是linq中标准的from子句的写法,它默认会定义两个变量位置一个 是上式所示的i 另一个是source,一般来说按要求 source需要是可枚举的即它能够被foreach,一般所有集合类型都是可枚举的, 阅读全文
posted @ 2024-02-02 18:13 ProjectDD 阅读(39) 评论(0) 推荐(0) 编辑
  2024年1月31日
摘要: 关于await又理解深一点了,以前有点懵,原来await 是对Task.Run的一个修饰(更准确的说是对Task实例的一个修饰,因为Task实例是必然会包装一个委托的所以就实现了对方法的包装,当这个方法调用时也就是Run时你可以选择是否使用await),叶节点,后续技节点是对标有async的方法进行 阅读全文
posted @ 2024-01-31 10:27 ProjectDD 阅读(108) 评论(0) 推荐(0) 编辑
  2024年1月12日
摘要: 最简单的算法是选择算法, 其次在选择算法的思想基础上有一点改进的是冒泡算法 再进一步在冒泡算法基础上更深化改进的算法是插入排序 你还知道什么算法他们的思想又是如何欢迎留言 阅读全文
posted @ 2024-01-12 12:56 ProjectDD 阅读(2) 评论(0) 推荐(0) 编辑
  2024年1月8日
摘要: 有遇到过这种情况的吗?我不确定是不是它的原因,总之安装之后经常让vscode卡死退出,最近这次直接黑屏死机了,不知道是不是它引起的,只能先卸载。 阅读全文
posted @ 2024-01-08 15:01 ProjectDD 阅读(28) 评论(0) 推荐(0) 编辑
  2023年11月4日
摘要: 本次采用最流行而又权威的benchmarkdotnet 基准测试库进行 因为确实看文档和网文上关于Span<T>的示例很少,最多就是切string, substring split方面的,具体意思感觉就是多次被调用时如果都在创建临时的数组对象会给gc带来负荷,而这正是Span<T>能解决的 目前我对 阅读全文
posted @ 2023-11-04 01:03 ProjectDD 阅读(28) 评论(4) 推荐(0) 编辑
  2023年4月20日
摘要: 阅读全文
posted @ 2023-04-20 18:04 ProjectDD 阅读(33) 评论(0) 推荐(0) 编辑
  2023年4月18日
摘要: 先看两段代码对比: static public T SimdDot(T[] a, T[] b) { if (a.Length != b.Length) throw new ArgumentException("The size of two matrix is not equal."); // if 阅读全文
posted @ 2023-04-18 02:25 ProjectDD 阅读(145) 评论(0) 推荐(0) 编辑
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示