C# 如何避免在结构类型上使用运算符重载进行二进制复制?
我有一个叫做Vector2D的结构。我在这里使用struct是为了从值类型中获益,而不是引用实例,因为向量通常与图形密切相关。我最不想要的是成千上万的向量做二进制拷贝。因为这个类只使用了两个浮点(64位),所以这不太重要,但我还是想了解一下 我想在Vector2D结构上使用运算符重载。我担心这至少会产生三个二进制副本:1个带有“new”的二进制副本,2个传入v1和v2的二进制副本C# 如何避免在结构类型上使用运算符重载进行二进制复制?,c#,C#,我有一个叫做Vector2D的结构。我在这里使用struct是为了从值类型中获益,而不是引用实例,因为向量通常与图形密切相关。我最不想要的是成千上万的向量做二进制拷贝。因为这个类只使用了两个浮点(64位),所以这不太重要,但我还是想了解一下 我想在Vector2D结构上使用运算符重载。我担心这至少会产生三个二进制副本:1个带有“new”的二进制副本,2个传入v1和v2的二进制副本 public static Vector2D operator +(Vector2D v1, Vector2D v2
public static Vector2D operator +(Vector2D v1, Vector2D v2)
{
return new Vector2D(v1.m_x + v2.m_x, v1.m_y + v2.m_y);
}
有没有其他方法可以提高结构的效率?在C#7.2中,您可以使用修改器中的避免大部分复制
public struct Vector2D
{
double m_x;
double m_y;
public Vector2D(in double m_x, in double m_y)
{
this.m_x = m_x;
this.m_y = m_y;
}
public static Vector2D operator +(in Vector2D v1, in Vector2D v2)
{
return new Vector2D(v1.m_x + v2.m_x, v1.m_y + v2.m_y);
}
}
确保在项目设置中使用的是C#最新的次要版本,并且运行的是最新的visual studio更新。(转到项目设置=>构建=>高级=>选择语言版本)
中的类似于ref
中的参数是只读的
因此,您通过引用传递v1
和v2
,而不复制它们。这对于较大的结构更有帮助。对于像您这样的小型结构,我认为它的性能不会更好
顺便说一下,我认为有更好的工具可以使用GPU更快地操纵矢量。我自己还没做过,但也许你可以看看这里,自己试试
按值复制是结构的本质,不是吗?我认为你不能再进一步改进了。请记住,过早的优化是万恶之源。在C++中,可以传递一个带有操作符重载的结构引用。C#的情况似乎并非如此。我有点惊讶,尽管“in”有助于更大的结构。使用in
传递非常小的结构实际上比按值传递要慢。这是因为64/32位值可以很容易地通过寄存器传递或推送到堆栈上。对于引用,您必须按值复制引用,然后加载该引用的值<在
中,code>主要用于传递64/32位引用优于复制的大型结构,例如大于256位结构。