Структуру можно передать или вернуть по значению или передать/вернуть по ссылке (через указатель) в C.
По общему мнению, первое может быть применено к малым структурам без штрафа в большинстве случаев. См. Есть ли случай, для которого возвращение структуры напрямую является хорошей практикой? и Есть ли недостатки для передачи структур по значению в C, а не для передачи указателя?
И это, избегая разыменования, может быть полезным как с точки зрения скорости, так и с ясностью. Но что считается маленьким? Я думаю, мы все можем согласиться, что это небольшая структура:
struct Point { int x, y; };
То, что мы можем относиться к ценности с относительной безнаказанностью:
struct Point sum(struct Point a, struct Point b) {
return struct Point { .x = a.x + b.x, .y = a.y + b.y };
}
И этот Linux task_struct
- это большая структура:
То, что мы хотели бы избежать накладывать на стек любой ценой (особенно с этими стеками режима ядра 8K!). Но как насчет средних? Я предполагаю, что структуры, меньшие, чем регистр, являются точными. Но как насчет этих?
typedef struct _mx_node_t mx_node_t;
typedef struct _mx_edge_t mx_edge_t;
struct _mx_edge_t {
char symbol;
size_t next;
};
struct _mx_node_t {
size_t id;
mx_edge_t edge[2];
int action;
};
Какое лучшее правило для определения того, достаточно ли структуры достаточно мала, чтобы было безопасно передавать ее по значению (за исключением смягчающих обстоятельств, таких как некоторая глубокая рекурсия)?
Наконец, пожалуйста, не говорите мне, что мне нужно профиль. Я прошу эвристики использовать, когда я слишком ленив/не стоит исследовать дальше.
EDIT: На данный момент у меня есть два последующих вопроса, основанных на ответах:
-
Что, если структура на самом деле меньше указателя на нее?
-
Что делать, если мелкая копия - это желаемое поведение (вызываемая функция все равно выполняет мелкую копию)?
EDIT: Не знаю, почему это стало помеченным как возможный дубликат, поскольку я на самом деле ссылаюсь на другой вопрос в моем вопросе. Я прошу разъяснить, что представляет собой небольшую структуру, и я хорошо знаю, что большинство структур времени следует передавать по ссылке.