是否有必要在只读结构中使用“in”修饰符?

在 C# 7.2 中,只读结构是否总是像存在“in”参数一样传递给函数?如果不是,在什么情况下复制内存是有用的,因为它是只读的?


我有一个只读结构:


public readonly struct Vec2 

{

     public readonly double X;

     public readonly double Y;

}

那么当调用数十亿次时,这两种方法之间是否会有性能差异:


public double Magnitude1(Vec2 v)

{

    return Math.Sqrt(v.X*v.X + v.Y*v.Y);

}

public double Magnitude2(in Vec2 v)

{

    return Math.Sqrt(v.X*v.X + v.Y*v.Y);

}

如果是这样,为什么编译器不识别 Vec2 是只读结构,而只是像“in”存在一样传递它?是否有一个实例,您可能想要传递一个没有“in”修饰符的只读结构?


不负相思意
浏览 138回答 1
1回答

人到中年有点甜

只读结构是否总是像存在“in”参数一样传递给函数?不。如果没有in修饰符,readonly结构是按值传递的,而不是按引用传递。如果不是,在什么情况下复制内存是有用的,因为它是只读的?如果你想保证内存没有改变,复制内存会很有用。请记住,结构可以更改,即使它是readonly. 例如:readonly struct S{    public readonly int I;    public S(int i) { this.I = i; }}class Program{    static S s1 = new S(1);    static void Main()    {        A(s1);    }    static void A(in S s2)    {        Console.Write(s2.I);        s1 = new S(2); // This is legal even though S is readonly!        Console.Write(s2.I);    }}in在参数 上使用修饰符时s2,输出为 12。没有in修饰符时,输出为 11。这种行为差异意味着编译器无法透明地in向readonly struct参数添加修饰符。(即使方法A没有修改s1,另一个线程也可以。)那么当调用数十亿次时,这两种方法之间是否会有性能差异?可能有;测量它并查看。我希望结构越大,按值传递的速度就越慢。如果是这样,为什么编译器不识别 Vec2 是只读结构,而只是像“in”存在一样传递它?是否有一个实例,您可能想要传递一个没有“in”修饰符的只读结构?也许如果struct它们非常小(例如,8 个字节或更少),按值传递(例如,在 CPU 寄存器中)可能比按引用传递(然后必须取消引用指针)便宜。
打开App,查看更多内容
随时随地看视频慕课网APP