2016-10-17 1 views
-3

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

Существует ли лучшие практики/идиомы в современных C более, является ли это лучше для вашей функции f для получения/возврат копирует части структуры VS. указателей на структуры?

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

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

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

+0

Зависит от размера структуры и является ли намерение сделать копию или просто изменить некоторые значения внутри структуры. – user3386109

ответ

1

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

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

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

1

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

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

Смежные вопросы