1 回答
TA贡献1895条经验 获得超7个赞
只读结构是否总是像存在“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 寄存器中)可能比按引用传递(然后必须取消引用指针)便宜。
- 1 回答
- 0 关注
- 136 浏览
添加回答
举报