Member 14707431 Ответов: 2

Путаница во введении ref return и ref local для C# 7.0


Я учусь
ref return and ref local for C# 7.0
Кто-то сказал, что ref return и ref local могут быть быстрее, особенно для ситуации, когда копируется большая структура, и приведите несколько хороших примеров для сравнения с использованием ref return и ref local и без них. да, это верно, для большой копии структуры это занимает гораздо больше времени, чем тип ref. но зачем вообще нужно использовать big struct?? вместо этого мы переходим на использование класса, тогда это занимает столько же времени, сколько и при использовании big struct + ref return/local, верно?
если это так, то демонстрационный пример выполнения ref return/local на основе big struct не является разумным? так ведь? если да, то кто-нибудь может привести мне лучший пример?
Спасибо!

Что я уже пробовал:

Я против большой структуры путем копирования, при помощи РЕФ местных классовый подход.

2 Ответов

Рейтинг:
20

Jon McKee

На занятия, ref как правило, он не очень хорошо работает с точки зрения производительности. Это эквивалентно псевдониму или ссылке из C++. Так что для void foo(ref SomeClass s), вместо s будучи копией референциального аргумента, он и есть аргумент. Например:

void foo(ref SomeClass s) { s = new SomeClass(); }
void foo2(SomeClass s) { s = new SomeClass(); }
//....
SomeClass x = new SomeClass();
foo(ref x); //x now points to the new SomeClass instance
foo2(x); //x doesn't change, the assignment is local to the function only


Поскольку копирование указателей не является узким местом в подавляющем большинстве программ, ref речь идет скорее о гибкости, чем о производительности при работе с классами.

Для структур, как вы уже заметили, это позволяет избежать копирования структуры. Структура не обязательно должна быть большой, чтобы это было полезно для производительности. Например, представьте себе большой, плотный цикл, который передает относительно небольшую структуру функции. Еще хуже, представьте, что функция не может быть встроена и обновляет структуру, возвращая ее. Это 3 копии на вызов - аргумент, возврат, назначение возврата. С помощью ref вы могли бы избежать всех трех копий.

Я думаю, что вы также слишком быстро игнорируете сообщение Гриффа. Он намекает на то, что вы не всегда можете просто сделать структуру классом. Это принципиально разные типы, которые выделяются по-разному с разными свойствами и предположениями, которые делает о них компилятор. Стек против основной памяти (как выделение, так и доступ), очистка, наследование и т. д.-Все это влияет на производительность и оптимизацию.

Доктора: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/ref-returns[^]


Member 14707431

Привет, Джон,
спасибо за ваше доброе и терпеливое объяснение.
Ваши комментарии очень полезны. Да, я согласен с вами, что ref-это не только концепция, связанная с производительностью. Для Реф лучше для struct копировать не только на большой структуре, но и по несколько экземпляров небольшой структуры.

Рейтинг:
2

OriginalGriff

Структура и класс-это не одно и то же, и вы не должны предполагать, что это так. Взгляните сюда, это может помочь: Использование структуры и класса - что это все значит?[^]


Member 14707431

Привет,
Спасибо за ваш намек, однако я не получил ответа на свой вопрос из этой статьи. Вместо этого эта статья также подтвердила то, что я сказал: big struct никогда не рекомендуется использовать!