Переменная, как вы можете догадаться из названия, изменяется со временем. Если он не меняется, «нет потерь». Когда вы сообщаете компилятору, что значение не изменится, компилятор может выполнить целую кучу оптимизаций, например, непосредственно вложить значение и никогда не выделять пространство для константы в стеке.
Однако вы не всегда можете рассчитывать на то, что ваш компилятор достаточно умный, чтобы иметь возможность правильно определить, изменится ли значение после его установки. В любой ситуации, когда компилятор не может определить это со 100-процентной уверенностью, компилятор будет ошибаться со стороны безопасности и предположить, что он может измениться. Это может привести к различным последствиям производительности, например, избегать встраивания, не оптимизировать определенные циклы, создавая объектный код, который не является удобным для параллелизма.
Из-за этого, и поскольку читаемость также важна, вы должны стремиться использовать явную константу, когда это возможно, и оставлять переменные для вещей, которые могут реально измениться.
Как почему константы используются вместо буквенных номеров:
1) Это делает код более читаемым. Всем известно, что 3.14 (надеюсь), не все знают, что 3.07 - ставка подоходного налога в ПА. Это пример знаний о доменах, и не все, кто будет поддерживать ваш код в будущем (например, налоговое программное обеспечение), узнают об этом.
2) Это экономит работу при внесении изменений. Переход и изменение каждые 3.07 до 3.18, если изменение ставки налога в будущем будет раздражать. Вы всегда хотите свести к минимуму изменения и в идеале сделать одно изменение. Чем больше одновременных изменений вы должны сделать, тем выше риск того, что вы что-то забудете, что приведет к ошибкам.
3) Вы избегаете рискованных ошибок. Представьте, что существовали два государства с ставкой налога на прибыль в размере 3,05, а затем одна из них изменилась до 3,18, а другая - на 3,07. Просто перейдя и заменив, вы можете столкнуться с серьезными ошибками. Конечно, многие значения целых или строковых констант более распространены, чем «3.07». Например, число 7 может представлять количество дней в неделю и что-то еще. В больших программах очень сложно определить, что означает каждое литеральное значение.
4) В случае текстового текста обычно используются символические имена для строк, чтобы позволить пулам строк быстро меняться в случае поддержки нескольких языков.
Обратите внимание, что помимо переменных и «постоянных переменных» существуют также некоторые языки с перечислениями. Перечисление фактически позволяет вам определить тип для небольшой группы констант (например, возвращаемых значений), поэтому их использование обеспечит безопасность типов.
Например, если у меня есть перечисление на дни недели и на месяцы, я буду предупрежден, если я назначу месяц в день. Если я просто использую целочисленные константы, не будет предупреждения, когда 3-й день назначается на месяц 3. Вы всегда нуждаетесь в безопасности типа, и это улучшает читаемость. Перечисления также лучше определяют порядок. Представьте, что у вас есть константы в дни недели, и теперь вы хотите, чтобы ваша неделя началась в понедельник, а не в воскресенье.
фиксированной длины сохранить s, где в худшем случае копируется новый массив. –
Для этого вопроса требуется только один контрпример: зачем вы делаете переменную PI переменной? –
@ Hans Passant: Вы уверены, что Pi является постоянным? Пока это измеряется только вблизи Земли. Вы уверены, что он постоянный во всем континууме пространства-времени? – 2010-06-01 22:35:42