Должны ли мы всегда возвращаться по ссылке, если можем? - PullRequest
0 голосов
/ 03 мая 2018

Теперь с C # 7 мы можем вернуться по ссылке с return ref. Из того, что я собрал, ссылки 32 или 64 бит. Теперь, если бы у меня была структура Coord с long X и long Y, это было бы 128 битов, так что было бы проще вернуть координаты (а также передать их) по ссылке, чтобы избежать копирования 128 биты.

С другой стороны, если бы я попытался return ref a byte, что составляет всего 8 бит, ссылка на него была бы намного больше, чем копирование самого байта, верно?

Итак, мой главный вопрос: Если объект, который мы хотим вернуть, может быть возвращен ref (т. Е. Не локальной переменной), и его размер больше, чем размер ссылки, мы должны вернуться ref

Редактировать: Пример быстрого кода

// This size is 128 bytes, which is 2 or 4x larger than the size of a reference
public struct Coord                                 
{
    public long X, Y;
}

private Coord myCoord;

// This will return the Coord by value, meaning copying the full 128 bytes
public Coord GetCoordValue() => myCoord;          

// This will return the Coord by reference, meaning copying only 32 or 64 bytes
public ref readonly Coord GetCoordRef() => ref myCoord;      

Кроме того, эта конкретная структура очень проста, и она уже в 2/4 раза меньше, чтобы вернуться на ref.

Редактировать 2: Я сделал GetCoordRef() readonly, чтобы вызывающая сторона не могла сохранить и изменить значение myCoord, тем самым сохраняя инкапсуляцию, хотя я полагаю, что это все равно не будет умный по умолчанию использовать его.

1 Ответ

0 голосов
/ 03 мая 2018

Если объект, который мы хотим вернуть, может быть возвращен с помощью ref (т. Е. Не локальной переменной), а его размер больше, чем размер ссылки, мы должны вернуться с помощью ref?

(1) №

(2) Только для опытных пользователей: да, именно в тех случаях, когда ваши эмпирические, точные данные профилирования указывают, что внесение этого изменения превращает вашу программу из программы, которая разочаровывает пользователей, в программу, которая радует пользователей .

Существуют ли на рынке программы, чей провал или успех можно отнести к разнице в пару наносекунд, когда копируют пару дополнительных байтов, торгуемых в течение пары наносекунд, для последующего перенаправления указателя? Я не знаю ни одного, но, возможно, вы пишете программы, пользователи которых имеют очень ограниченный бюджет на количество наносекунд, которое они хотят, чтобы ваш API потратил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...