Итак, я искал руководящие принципы по двум темам:
- Когда для вернуть структуру по значению, а когда вернуть ее по указателю (в случае, когда вызываемая функция создала структуру). Например:
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
его и связать с управлением жизненным циклом.
- По умолчанию передает структуру по указателю - больше не нужно беспокоиться об управлении жизненным циклом, чем у нас, и нет ненужного копирования данных.
Широко ли приняты эти руководящие принципы среди программистов на Си? Если нет, то какие соглашения будут более общепринятыми?