C#7.2引入了reference semantics with value-types,与此同时,Microsoft开发了 Span<T> and ReadOnlySpan<T> 之类的类型,以潜在地提高需要在内存的连续区域上执行操作的应用程序的性能。

根据文档,潜在地提高性能的一种方法是通过向这些类型的参数添加in修饰符来通过引用传递不可变的结构:

void PerformOperation(in SomeReadOnlyStruct value)
{
}

我想知道的是,是否应该使用ReadOnlySpan<T>这样的类型来执行此操作。我应该声明这样的方法来接受只读范围吗:
void PerformOperation<T>(in ReadOnlySpan<T> value)
{
}

或简单地像:
void PerformOperation<T>(ReadOnlySpan<T> value)
{
}

前者会比后者提供任何性能优势吗?我找不到任何明确向这两个方向提出建议的文档,但是我确实找到了this example,在那里他们演示了一种接受ReadOnlySpan且未使用in修饰符的方法。

最佳答案

这里的一个关键因素是尺寸。 Span<T>/ReadOnlySpan<T>故意很小,因此跨度和跨度引用之间的差异很小。此处in的一个关键用法是用于较大的只读结构,以避免大量的堆栈复制。请注意,这是一个折衷方案:in实际上是ref,因此您要为所有访问添加一个间接层,除非JIT知道您在做什么并且可以使用某些伏都教。当然,如果类型没有声明为readonly,则会在调用之前自动添加堆栈副本以保留语义。

关于c# - ReadOnlySpan <T>参数是否应该使用 "in"修饰符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49297751/

10-08 23:25