我应该通过ref传递IntPtr以获得更好的延迟吗

本文关键字:更好 延迟 ref 传递 IntPtr 我应该 | 更新日期: 2023-09-27 18:26:26

IntPtrstruct,因此默认情况下是按值传递的,这可能会很昂贵(因为每次都会创建新对象),因此当新对象不是强制性的时,我们最好通过引用传递。例如,我写了这样的代码(请忽略硬编码的"幻数"):

    public static DateTime IntPtrToDateTime(ref IntPtr value, int offset)
    {
        short year = Marshal.ReadInt16(value, offset);
        byte month = Marshal.ReadByte(value, offset + 2);
        byte day = Marshal.ReadByte(value, offset + 3);
        byte hour = Marshal.ReadByte(value, offset + 4);
        byte minute = Marshal.ReadByte(value, offset + 5);
        byte second = Marshal.ReadByte(value, offset + 6);
        short msec = Marshal.ReadInt16(value, offset + 8);
        return new DateTime(year, month, day, hour, minute, second, msec);
    }

工作正常,但我怀疑我是否真的应该通过IntPtr参考?我认为IntPtr结构非常"轻",并且很容易创建。

同样,在.NET框架中的Marshal类中,通过值传递IntPtr,例如Marshal.ReadInt64,我想Marshal类被设计为尽可能低的延迟,但为什么IntPtr不通过引用传递呢?

  • 什么是更快的按值或按引用传递IntPtr
  • 如果通过引用传递更快,那么为什么Marshal类通过值传递IntPtr

我应该通过ref传递IntPtr以获得更好的延迟吗

不,您不应该通过引用传递它。在这种情况下,这只会在代码中造成更多的开销。

由于它是一个指针大小的结构,通过值和引用传递它将在堆栈上放入相同数量的数据,而将其放入堆栈将需要大约相同的工作量。

但是,使用通过引用传递的参数将导致另一个间接级别。不是从堆栈读取值,而是从堆栈读取指针,然后使用指针读取值。

此外,在语义上,对于实际想要更改用于传递值的变量的参数,应该只使用refout

如果出于性能原因想要通过引用传递一个大结构,那么实际上是大结构本身导致了性能问题,而不是如何将其作为参数传递。你应该把它变成一个类,而不是改变它的传递方式。

结构是按值传递的,并且没有为它们分配新的堆对象。此外,IntPtr是CLR本机理解的类型。它是单个指针的大小。您应该期望与intlong相同的性能配置文件(取决于您的比特数)。

通过引用传递它会减慢速度,因为你用指针包装指针。