У меня есть пример кода, как этот, в котором буквальное 1
повторяется несколько раз.
foo(x - 1);
y = z + 1;
bar[1] = y;
Должен ли я определить константу ONE
и заменить литералы этим?
constexpr int ONE = 1;
foo(x - ONE);
y = z + ONE;
bar[ONE] = y;
Повлияет ли эта замена на повышение производительности и / или уменьшение размера машинного кода в пользу снижения читабельности кода? Изменит ли число повторений литерала ответ?
Это не принесет вам никаких улучшений производительности / памяти. Тем не менее, вы должны попытаться сохранить свой код в чистоте от магические числа. Итак, если в вашем коде есть повторяющаяся константа в нескольких местах, и во всех этих местах эта константа одинакова с логической точки зрения, было бы лучше сделать его именованной константой.
Пример:
const int numberOfParticles = 10; //This is just an example, it's better not to use global variables.
void processParticlesPair(int i, int j) {
for (int iteration = 0; iteration < 10; ++iteration) {
//note, that I didn't replace "10" in the line above, because it is not a numberOrParticles,
//but a number of iterations, so it is a different constant from a logical point of view.//Do stuff
}
}
void displayParticles() {
for (int i = 0; i < numberOfParticles; ++i) {
for (int j = 0; j < numberOfParticles; ++j) {
if (i != j) {
processParticlesPair(i, j);
}
}
}
}
Зависит. Если у вас просто есть 1
s в вашем коде, и вы спрашиваете, должны ли вы заменить их: НЕ Держите ваш код в чистоте. У вас не будет никаких преимуществ по производительности или памяти — еще хуже, вы можете увеличить время сборки
Если 1
Однако это параметр времени сборки: Да, пожалуйста, введите константу! Но выберите лучшее имя, чем ONE
!
Должен ли я определить константу
ONE
и заменить литералы этим?
Нет, абсолютно нет. Если у вас есть имя, которое указывает на имея в виду числа (например, NumberOfDummyFoos
), если его значение может измениться, и вы хотите предотвратить его обновление в дюжине мест, тогда вы можете использовать для этого постоянную, но постоянную ONE
не добавляет абсолютно никакой ценности над литералом 1
,
Повлияет ли эта замена на повышение производительности и / или уменьшение размера машинного кода в пользу снижения читабельности кода?
В любой реалистичной реализации это не так.
Замена литералов именованными константами имеет смысл,
если значение константы особенное. Замена 1
с ONE
является
просто накладные расходы в большинстве случаев и не добавляет никакой полезной информации
читателю, особенно если он используется в различных функциях (указатель, часть расчета и т. д.). Если запись 1 массива является чем-то особенным, используя константу THE_SPECIAL_INDEX=1
будет иметь смысл.
Для компилятора это обычно не имеет никакого значения.
При сборке одно постоянное значение обычно занимает столько же памяти, сколько и любое другое. Установка постоянного значения в вашем исходном коде для человека более удобна, чем оптимизация.
В этом случае использование ONE таким способом не является ни улучшением производительности, ни удобочитаемостью. Вот почему вы, вероятно, никогда не видели его в исходном коде;)