Итак, я искал практические рекомендации по двум темам:
- Когда возвращать структуру по значению, а когда возвращать ее по указателю (в случае, когда вызываемая функция создала структуру). Например:
MyThing make_my_thing() { MyThing m; /* ... */ ; return m; }
// Vs.
MyThing* make_my_thing() { MyThing* m = malloc(sizeof(MyThing)); /* ... */ ; return m; }
- Когда передавать структуру по значению, а когда - по указателю
// Assume do_something() doesn't need to mutate m
void do_something(MyThing m) { /* ... */ }
// Vs.
void do_something(MyThing* m) { /* ... */ }
Эмпирическое правило, которое я ищу, не должно подходить для всех случаев, но должно использоваться по умолчанию, которое я использую в общем случае, когда структура не очень большая.
Обратите внимание: я знаю, что в разных случаях могут потребоваться разные решения, но, тем не менее, я ищу базовое стандартное соглашение, которому следуют большинство разработчиков, если оно существует.
Я прочитал много вопросов и ответов на этом сайте и разработал следующие рекомендации:
- По умолчанию используется возврат структуры по значению. В противном случае нам пришлось бы
malloc
это сделать и возиться с управлением его жизненным циклом. - По умолчанию используется передача структуры по указателю - не нужно беспокоиться об управлении жизненным циклом больше, чем мы уже делаем, и нет ненужного копирования данных.
Широко ли приняты эти рекомендации среди программистов на C? Если нет, какие соглашения будут более общепринятыми?
struct
любого размера по значению - это большой мертвый груз. - person Weather Vane   schedule 25.04.2019struct
, который маленький, может быть, даже меньше указателя, не является мертвым грузом. - person chux - Reinstate Monica   schedule 25.04.2019