代码之家  ›  专栏  ›  技术社区  ›  DxCK

Marshal.PtrToStringUni()与新字符串()?

  •  7
  • DxCK  · 技术社区  · 16 年前

    假设我有一个指向unicode字符串的char*类型指针,我知道长度:

    char* _unmanagedStr;
    int _unmanagedStrLength;
    

    我有两种方法将其转换为.NET字符串:

    Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength);
    

    new string(_unmanagedStr, 0, _unmanagedStrLength);
    

    在我的测试中,两个调用都给出了完全相同的结果,但是 new string() 速度大约是其速度的1.8倍 Marshal.PtrToStringUni()

    2 回复  |  直到 16 年前
        1
  •  9
  •   Hans Passant    16 年前

    从可用的源代码(Rotor)判断,System.String(Char*)构造函数通过CtorCharPtr()使用高度优化的代码路径,它使用FastAllocateString()分配字符串。McSal.ptrtoString()遵循完全不同的代码路径,它是用C++编写的,并且看起来是复制两次字符串,而没有“快速分配器”的好处。

    显然,不是同一个程序员在做这个。几乎可以肯定,甚至不是同一个团队,因为代码适合不同的编程模型。最接近的共同管理者可能是四级以上。

    不确定这会有什么帮助,请使用快速的。意外事件会在Windows上产生类似的异常。

        2
  •  8
  •   Darin Dimitrov    16 年前

    第二个是不符合CLS的,需要不安全的代码,可能有不确定的行为,这就是为什么它可能更快的原因。还有一个需要 pin 指向非托管地址或垃圾收集器的指针可能会重新分配该地址,从而导致代码更加混乱。除非您确定这是应用程序的瓶颈,否则您可能希望使用 PtrToStringUni 功能。

    推荐文章