Использование const double для промежуточных результатов - PullRequest
4 голосов
/ 25 мая 2010

Я пишу программу для моделирования и задаюсь вопросом, имеет ли смысл использовать const double при сохранении промежуточных результатов. Рассмотрим этот фрагмент:

double DoSomeCalculation(const AcModel &model) {
   (...)
   const double V = model.GetVelocity();
   const double m = model.GetMass();
   const double cos_gamma = cos(model.GetFlightPathAngleRad());
   (...)
   return m*V*cos_gamma*Chi_dot;
}

Обратите внимание, что образец приведен только для иллюстрации - он может не иметь особого смысла с инженерной стороны. Мотивация сохранения, например, cos_gamma в переменной, заключается в том, что этот косинус много раз используется в других выражениях, охватываемых (...), и я чувствую, что код становится более читабельным при использовании

cos_gamma 

вместо

cos(model.GetFlightPathAngleRad())

в различных выражениях. Теперь вопрос заключается в следующем: поскольку я ожидаю, что косинус будет одинаковым во всем разделе кода, и я фактически создал вещь только как заполнитель, и для удобства я склонен объявлять его const. Есть ли устоявшееся мнение о том, хорошо это или плохо, или это может в конце концов укусить меня? Компилятор использует эту дополнительную информацию или я действительно мешаю компилятору выполнять полезные оптимизации?

Arne

Ответы [ 5 ]

6 голосов
/ 25 мая 2010

Я не уверен в части оптимизации, но я думаю, что было бы хорошо объявить ее как const. Это происходит потому, что если код большой, то если кто-то неправильно введет cos_gamma = 1 между ними, вы получите ошибку компилятора вместо сюрпризов во время выполнения.

4 голосов
/ 25 мая 2010

Вы, безусловно, можете помочь, только рассчитав косинус один раз и используя его повсюду.Получение такого результата const - отличный способ убедиться, что вы (или кто-то еще) не пытаетесь изменить его где-то в будущем.

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

3 голосов
/ 25 мая 2010

Учитывая ваш код:

const double V = model.GetVelocity();
const double m = model.GetMass();
const double cos_gamma = cos(model.GetFlightPathAngleRad());

Я бы, наверное, оставил cos_gamma как есть. Я бы рассмотрел изменение V и m на ссылки, хотя:

const double &V = model.GetVelocity();
const double &m = model.GetMass();

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

2 голосов
/ 25 мая 2010

Хотелось бы, чтобы я работал с таким большим количеством кода, написанного вот так!

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

Моя самая большая проблема в C ++ - это то, что значения не const по умолчанию. Используйте const свободно и держите пулевое отверстие в ваших ногах свободным!

0 голосов
/ 25 мая 2010

Вопрос об использовании компилятором - интересный вопрос - когда вы находитесь на этапе оптимизации полностью работающей программы . До тех пор вы пишете программу в основном для людей, которые приходят позже и должны посмотреть на код. Компилятор с радостью проглотит (объективно) очень нечитаемый код, ему не хватает пробелов, переносов строк и веселых отступов. Люди не будут.
Самый важный вопрос: насколько читабелен код , а насколько легко допустить ошибку, изменив его . Здесь const очень помогает, потому что компилятор лает на каждого, кто по ошибке меняет все, что не должно меняться. Я всегда делаю все const, если я действительно, действительно не хочу, чтобы это было изменчиво.

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