Изменение аргументов, передаваемых по значению, внутри функции и использование их в качестве локальных переменных - PullRequest
10 голосов
/ 21 января 2010

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

Это хорошая вещь? Есть ли какие-либо подводные камни в этом, или это нормально для такого кода?

Ответы [ 2 ]

8 голосов
/ 21 января 2010

По сути, параметр функции - это локальная переменная, так что эта практика в принципе неплоха.

С другой стороны, это может привести к головной боли при обслуживании. Если позже появится другой программист, он может ожидать, что переменная будет содержать переданное значение, и изменение вызовет ошибку.

Одним из оснований для повторного использования переменной является неверное представление об эффективности использования памяти. На самом деле, это не может улучшить эффективность и может снизить ее. Причина в том, что компилятор может автоматически определить, полезно ли использовать один и тот же регистр для двух разных переменных в два разных времени, и сделает это, если будет лучше. Но программист не должен принимать это решение за компилятор. Это ограничит выбор, который может сделать компилятор.

Самая безопасная практика - использовать новую переменную, если ей нужно новое значение, и полагаться на компилятор, чтобы сделать ее эффективной.

2 голосов
/ 21 января 2010

Никаких проблем, которые я могу придумать. Аргументы будут помещены в текущий кадр стека или в регистры, как и любая другая локальная переменная Однако убедитесь, что аргументы передаются по значению. В частности, массивы передаются по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...