我有一个名为Vector2D的结构。我在这里使用struct来受益于值类型而不是对实例的引用,因为向量通常与图形密集相关。我想要的最后一件事是成千上万的矢量做二进制副本。由于该类只使用了两个浮点数(当然是64位),所以它并不是一个值得关注的问题,但无论如何我想要了解它。
我想在我的Vector2D结构上使用运算符重载。我担心这至少会产生三个二进制副本:1个带有'new'的二进制副本,2个传递给v1和v2的二进制副本。
public static Vector2D operator +(Vector2D v1, Vector2D v2)
{
return new Vector2D(v1.m_x + v2.m_x, v1.m_y + v2.m_y);
}
是否有不同的方法可以使结构更有效?
答案 0 :(得分:0)
在C#7.2中,您可以使用in
修饰符来避免大部分复制。
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更新。 (转到项目设置=> build => advanced =>选择语言版本)
in
与ref
类似,其中in
参数是只读的。
所以您通过引用传递v1
和v2
而不复制它们。这对更大的结构更有帮助。对于像你这样的小结构,我认为它的表现要好得多。
顺便说一句,我认为有更好的工具可以更快地使用GPU来操纵向量。我没有做过我的自我,但也许看看这里并尝试自己。