Существуют ли идиоматические рекомендации по изменению структур в C?

#c

#c

Вопрос:

Допустим, вы хотите создать функцию f на C, которая преобразует некоторую структуру, скажем struct s1 .

Существуют ли в современном C рекомендации / идиомы по поводу того, лучше ли вашей функции f получать / возвращать копии структуры или указатели на структуру?

Например, вот несколько возможных сигнатур типов для f (и я уверен, что есть еще что-то, чего мне не хватает):

 struct s1 f(struct s1)
struct* s1 f(struct* s1)
void f(struct *s1)
  

В общем, люди пытаются избегать некоторых из этих сигнатур типов по сравнению с другими?

Комментарии:

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

Ответ №1:

Последнее является идиоматическим.

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

Однако вы увидите все три метода в реальном коде C.

Ответ №2:

Я думаю, что вопрос о работе с копиями полностью зависит от намерения — учитывая, что клонирование и изменение клона сильно отличаются от изменения оригинала. Так что это исключает # 1

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