Передача и возврат структур по значению или по указателю - есть ли рекомендации по умолчанию? - PullRequest
0 голосов
/ 25 апреля 2019

Итак, я искал руководящие принципы по двум темам:

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

Широко ли приняты эти руководящие принципы среди программистов на Си? Если нет, то какие соглашения будут более общепринятыми?

1 Ответ

2 голосов
/ 25 апреля 2019

Передача и возврат структур по значению или по указателям

1) Малый размер. Когда struct мало - я бы сказал, что <= в два раза больше указателя, при увеличении размера мало что будет потеряно при передаче по <code>struct по значению, а не по указателю на struct. Получена простота передачи объекта по значению.

2) Большой размер. Когда struct большой, то, безусловно, передача структуры pointer to a более эффективна.

3) Числовой объект. Когда struct имеет фиксированный размер размещения и представляет число , передача по значению, кажется, работает лучше.

4) Сокрытие. Непрозрачные точки на struct являются хорошим способом скрыть внутренности struct и продвигать объектно-ориентированный код.

В других случаях я бы сказал код для ясности - что обычно означает использование указателя на struct в качестве идиоматического кода.


Для общего использования я нахожу повторную настройку указателя на struct небольшого значения - кроме одного важного случая: формирования набора функций, в которых функции init возвращают выделенный указатель на struct.

...