如何在结构类型上使用运算符重载来避免二进制副本?

时间:2018-04-01 07:47:08

标签: c#

我有一个名为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);
}

是否有不同的方法可以使结构更有效?

1 个答案:

答案 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 =>选择语言版本)

inref类似,其中in参数是只读的。

所以您通过引用传递v1v2而不复制它们。这对更大的结构更有帮助。对于像你这样的小结构,我认为它的表现要好得多。

顺便说一句,我认为有更好的工具可以更快地使用GPU来操纵向量。我没有做过我的自我,但也许看看这里并尝试自己。

Utilizing the GPU with csharp