c# - 返回新结构时如何防止复制?

标签 c# optimization struct

我有一个以 transient 方式使用的结构,看起来像这样:

internal readonly struct TrackingId
{
    public readonly string Source1;
    public readonly string Source2;
    public readonly string SourceN;

    // Computed from Source1..N
    public readonly string Value; 

    private TrackingId(string source1, string source2, string sourceN)
    {
        Source1 = source1;
        Source2 = source2;
        SourceN = sourceN;

        Value = String.Join("-", Source1, Source2, SourceN);
    }

    public static TrackingId Create(string source1, string source2, string sourceN)
    {
        return new TrackingId(source1, source2, sourceN);
    }
}

实际类型有很多字段,所以执行复制是非常不可取的行为。但是,我的理解是运行时会将新实例复制到调用方,除非/直到它决定内联 Create 方法,但不能保证会发生这种情况。

我本质上是在寻找类似于 C++ 的复制省略的东西,其中返回的对象是在调用者的存储中就地构造的;有什么方法可以可靠地阻止 Create 方法执行复制?

最佳答案

不幸的是,我想你已经知道这里的答案了。由于您已确定的限制,无法实现您想要的。

您能够做到这一点的唯一方法是使用 ref 返回。然而,您不能返回本地创建的值类型引用。因此,您无法减轻防御性副本

您还排除了使用 ref/in/out 修饰符,这些也会减轻防御性副本.

所以,你被困住了,无法实现你想要的。

  • 如果您不想复制,则必须放弃 Create 类型的方法
  • 或者你将不得不开始使用允许通过引用传递结构的语言特性,通过使用readonly和/或 in/ref/out 修饰符,或对 非本地 类型使用 ref return

简而言之,您将需要重构您的工作流程以适应无副本代码。

关于c# - 返回新结构时如何防止复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55348219/

相关文章:

c# - 调用 C++ dll 时出现 System.AccessViolationException

c# - 字符串内计数的整洁解决方案

java - 对于互斥条件,多个 "if"语句与 "if else if"之间是否存在性能差异?

c++ - 在 C++ 中有效地传递和返回对象

c++ - 为什么我的 8M L3 缓存对大于 1M 的阵列没有任何好处?

c# - 连接错误 : Cannot concatenate media using NReco Video Converter for . NET (C#)

c# - Wpf TreeView 从上下文菜单获取项目

使用结构创建游戏板

C 结构函数指针传递自引用作为参数

声明结构时的 C++ 问题