Есть ли случаи, когда возврат структуры напрямую является хорошей практикой? - PullRequest
4 голосов
/ 26 сентября 2011

IMO весь код, который возвращает структуру напрямую, может быть изменен для возврата указателя на структуру.

Когда возвращение структуры напрямую является хорошей практикой?

Ответы [ 6 ]

7 голосов
/ 26 сентября 2011

Модифицировано как? Возврат указателя на статический экземпляр структуры внутри функции, что делает функцию не реентерабельной; или возвращая указатель на выделенную структуру кучи, которую вызывающая сторона должна обязательно освободить и сделать это соответствующим образом? Я бы хотел, чтобы возвращение структуры было хорошей практикой в ​​общем случае.

4 голосов
/ 26 сентября 2011

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

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

2 голосов
/ 26 сентября 2011

Я вижу следующие случаи, к которым я бы чаще всего подходил для проходящих структур:

  • Код стиля "Функциональное программирование".Множество вещей передается, и наличие указателей сильно усложнит код (и это даже не считается, если вам нужно начать использовать malloc + free)

  • Небольшие структуры, как, например,

    struct Point{ int x, y; };
    

    не стоит тратить время на передачу информации по ссылке.


И, наконец, давайте не будем забывать, что передача по значению ипередача по ссылке на самом деле сильно отличается, поэтому некоторые классы программ будут более подходить для одного стиля и в конечном итоге будут выглядеть ужасно, если вместо этого будет использоваться другой стиль.

1 голос
/ 26 сентября 2011

Эти другие ответы хороши, но я думаю, что скучаю не ближе всего к «ответу на вопрос», упоминая маленькие структуры. Чтобы быть более конкретным, если сама структура состоит всего из нескольких машинных слов, то и возражение «пространства», и возражение «времени» преодолеваются. Если указатель - одно слово, а структура - два слова, насколько медленнее будет операция копирования структуры по сравнению с копией указателя? Я подозреваю, что в кешированной архитектуре ответ «ни один из всех». А что касается пробела, 2 слова в стеке <1 слово в стеке + 2 слова (+ накладные расходы) в куче. </p>

Но эти соображения применимы только к конкретным случаям: ЭТА часть ЭТОЙ программы на ЭТОЙ архитектуре.

Для уровня написания программ на С вы должны использовать то, что легче читать.

0 голосов
/ 26 сентября 2011

Есть несколько случаев, когда возвращение структуры по значению противопоказано:

1) Библиотечная функция, которая возвращает данные «токена», которые должны быть позже использованы в других вызовах, например.дескриптор потока файла или сокета.Возврат полной структуры нарушил бы инкапсуляцию библиотеки.

2) Структуры, содержащие буферы данных переменной длины, где структура была изменена с учетом абсолютного максимального размера данных, но где средний размер данных намного меньшенапримерструктура сетевого буфера, в конце которой находятся dataLen int и char data [65536].

3) Большие структуры любого типа, где стоимость копирования данных становится значительной, например:

a) Когда структура должна быть возвращена через несколько вызовов функций - многократное копирование одних и тех же данных.

b) Когда структура впоследствии ставится в очередь в другие потоки - широкие очереди означают более длительную блокировкураз во время копирования / копирования и, следовательно, повышается вероятность конфликта.Это и размер структуры накладывается на стеки потоков как производителя, так и потребителя.

c) Где структура часто перемещается между слоями, например.стек протоколов.

4) Где структуры различного def.должны храниться в любом массиве / списке / очереди / стеке / whatContainer.

Я подозреваю, что я настолько испорчен с ++ и другими ОО-языками, что я склонен к неправильному поиску / обновлению почти всего, что не может быть сохранено внативный тип

Rgds, Martin

0 голосов
/ 26 сентября 2011

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

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