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/