Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免在结构类型上使用运算符重载进行二进制复制?_C# - Fatal编程技术网

C# 如何避免在结构类型上使用运算符重载进行二进制复制?

C# 如何避免在结构类型上使用运算符重载进行二进制复制?,c#,C#,我有一个叫做Vector2D的结构。我在这里使用struct是为了从值类型中获益,而不是引用实例,因为向量通常与图形密切相关。我最不想要的是成千上万的向量做二进制拷贝。因为这个类只使用了两个浮点(64位),所以这不太重要,但我还是想了解一下 我想在Vector2D结构上使用运算符重载。我担心这至少会产生三个二进制副本:1个带有“new”的二进制副本,2个传入v1和v2的二进制副本 public static Vector2D operator +(Vector2D v1, Vector2D v2

我有一个叫做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);
}
有没有其他方法可以提高结构的效率?

在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位结构。