Лучше переходить между функциями или передавать значения из функции в функцию? С - PullRequest
1 голос
/ 16 марта 2012

У меня быстрый вопрос. Как правило, лучше переходить между функциями или передавать значения из функции в функцию?

Например, в игре, над которой я сейчас работаю, со структурой game_structure в качестве структуры, содержащей все данные, было бы лучше передать новые game_structures между функциями или использовать функции более или менее меньше как петли? В настоящее время, например, я вызываю функцию inventory(game_structure *gs), которая перебирает команды инвентаризации. Однако, когда он закончится, он запускает функцию game_loop(game_structure *gs);, которая возвращается в игру. Было бы лучше, если бы я inventory(game_structure *gs) вернул game_structure для вызова куда-то еще?

Но даже в других случаях, что выгоднее? Переход между циклами или возвращение значений?

Ответы [ 3 ]

1 голос
/ 16 марта 2012

Я думаю, что это помогает поддерживать работоспособность, если программный поток построен процедурным образом (если это вообще возможно).Таким образом, вызов другой функции в конце функции, когда вызывающая сторона не заботится о результате вызова функции, усложняет ситуацию.В своем коде я стараюсь свести к минимуму ненужные вложенность вызовов и рекурсию.Это делает вашу жизнь проще, когда дело доходит до поддержки кода.

0 голосов
/ 06 января 2014

Это вопрос размера стека в сравнении с копией объекта.

В частности, для C передайте значение или ссылку на другие функции. Это не только поддерживает логику, но и является верным путем почти во всех случаях.

Если вы вызываете другую функцию в операторе return, исходный стек не уничтожается и создается новый стек для новой функции. При этом во время перехода функции объект будет скопирован или перемещен в новый стек для манипуляции. Зависит от компилятора, хотя он не гарантированно будет «перемещен», поэтому сделайте это так же, как передавая объект по значению в функцию плюс возможность переполнения стека.

Лучшая практика, если вы действительно много раз беспокоитесь о копировании большого объекта, - объявлять объект как глобальный статический в пределах своей жизненной области. При вызове функций передавайте ссылку на объект. Хотя есть одна загвоздка. Вы должны быть особенно осторожны при обращении к памяти, поскольку данные могут быть непреднамеренно изменены.

0 голосов
/ 16 марта 2012

Это действительно зависит от того, что вы делаете, и от того, какой язык программирования вы используете.

В CI будет ошибка из-за повторного использования структуры и избегания слишком большого количества рекурсивных вещей (чтобы избежать перебора стека),В конце концов, написание кода и использование небольшого количества памяти - это все, что в настоящее время является C, и материал mallocinc тоже очень раздражает.

С другой стороны, если бы я программировал это на Haskell, я бы ошибался на стороненеизменяемые структуры данных и тонны рекурсии / хвостовой рекурсии.

...