Как правило, предпочтительно передавать указатель на структуру функции в C, чтобы избежать копирования во время вызова функции. Это имеет нежелательный побочный эффект, который вызванная функция может непреднамеренно модифицировать элементы структуры. Какая хорошая практика программирования, чтобы избежать таких ошибок без ущерба для эффективности вызова функции?Предпочтительно передать указатель на структуру функции в C
ответ
Передаёт указатель на сопзЬ очевидный ответ
void foo(const struct some_struct *p)
Это предотвратит вас от изменения непосредственных членов структуры непреднамеренно. Вот что такое const
.
На самом деле, ваш вопрос звучит как копия с какой-либо викторины, а const
- ожидаемый ответ.
В общем, когда речь идет о простых оптимизаций, как то, что вы описали, часто предпочтительно использовать pointer-to-struct
, а не пропускании struct
себя, как переход в целом struct
означает больше накладных расходов из дополнительных данных, которые копируются на стек вызовов.
В приведенном ниже примере является довольно распространенным подходом:
#include <errno.h>
typedef struct myStruct {
int i;
char c;
} myStruct_t;
int myFunc(myStruct_t* pStruct) {
if (!pStruct) {
return EINVAL;
}
// Do some stuff
return 0;
}
Если вы хотите, чтобы избежать изменения данных, передаваемых в функцию, просто убедитесь, что данные неизменны путем модификации прототипа функции.
int myFunc(const myStruct_t* pStruct)
Вы также выиграют от чтения на "const correctness".
Очень распространенная идиома, особенно в системном коде стиля unix/posix, заключается в том, чтобы вызывающий объект выделял структуру и передавал указатель на эту структуру через вызов функции.
Это немного отличается от того, что я думаю, что вы спрашиваете о том, где вы передаете данные в функцию со структурой (где, как говорят другие, вы можете рассматривать функцию как const). В этих случаях структура остается пустой (или только частично заполненной) перед вызовом функции. Вызывающий будет делать что-то вроде выделения пустой структуры, а затем передает указатель на эту структуру. Наверное, иначе, чем ваш общий вопрос, но я думаю, что это касается обсуждения.
Это обеспечивает пару удобных вещей. Он избегает копирования возможной большой структуры, а также позволяет заполнителю заполнить некоторые поля и вызываемый, чтобы заполнить другие (давая эффективное общее пространство для связи).
Важнейшим аспектом этой идиомы является то, что вызывающий пользователь имеет полный контроль над распределением структуры. Он может иметь его в стеке, кучи, повторно использовать один и тот же один раз, но когда он приходит от вызывающего, он отвечает за обработку памяти.
Это одна из проблем с передачей указателей на структуру; вы можете легко потерять информацию о том, кто выделил эту структуру и чья ответственность заключается в ее освобождении. Эта идиома дает вам преимущество в том, что вам не нужно копировать структуру вокруг, давая понять, кто имеет работу по освобождению памяти.
Ты взял меня на борт до последнего абзаца. Он никогда не должен сводиться к тому, чтобы потерять следы того, кому принадлежит блок объектов/блоков памяти и как он был выделен. Современные IDE и инструменты делают это не проблемой. – DevNull
Вы, конечно, не должны терять из виду, кому принадлежит куча памяти. Легкость, с которой вы можете это сделать, меняется. Имейте в виду, что мы говорим о C здесь, а не C++. C++ делает выделение памяти совершенно другой. –
Я согласен, что они разные, я всегда находил, что C легче отслеживать память, чем C++. В C он очень вырезанный и сухой. В C++, если вы не придерживаетесь учебника «правило из трех» и т. Д., Нужно отслеживать нюансы между конструкторами, конструкторами копирования, конструкторами присваивания, виртуальными деструкторами и т. Д. – DevNull
- 1. Передать указатель на структуру
- 2. передать указатель на структуру C++ в Ada
- 3. Лучше передать структуру или указатель на структуру?
- 4. Вызов функции в C & указатель на структуру
- 5. Как передать указатель на структуру в JNA?
- 6. C++ возвращает указатель на структуру из функции
- 7. Указатель на указатель на структуру в c
- 8. C передающий указатель на указатель в функции
- 9. Как передать указатель на структуру через Pinvoke?
- 10. Возвращаясь указатель на структуру malloc'ed в функции
- 11. Получить указатель на структуру C в Swift
- 12. передавая указатель на инициализированную структуру в функции
- 13. C - передать функции указатель на указатель на функцию
- 14. c свободный указатель на структуру
- 15. Как передать указатель на объект функции? C++
- 16. Указатель на структуру, указатель на структуру
- 17. ЮНА: Указатель на указатель на структуру
- 18. Как передать структуру функции в C++?
- 19. Как вернуть указатель на структуру из функции?
- 20. Как передать структуру в функции?
- 21. Как маршалировать структуру как указатель на структуру?
- 22. C - Конструктор, лучше вернуть структуру или указатель на структуру?
- 23. Указатель на указатель на структуру
- 24. Функции: передать указатель на $ con
- 25. Инициализировать структуру, содержащую указатель на указатель на структуру
- 26. Переходя на структуру к функции в C
- 27. Как инициализировать указатель на структуру в C++?
- 28. C: указатель на структуру в определении структуры
- 29. массив указатель на структуру в выходной C++
- 30. Mallocing указатель на другую структуру в C
Возможный дубликат [лучше ли в C++ проходить по значению или передавать постоянную ссылку?] (Http://stackoverflow.com/questions/270408/is-it-better-in-c-to-pass- by-value-or-pass-by-constant-reference) – 2501
@ 2501 Нет. Даже не. – Qix
Это тестовый вопрос?(просто любопытно) – ryyker