Должен ли я определить константы для повторяющихся литералов в коде?

У меня есть пример кода, как этот, в котором буквальное 1 повторяется несколько раз.

foo(x - 1);
y = z + 1;
bar[1] = y;

Должен ли я определить константу ONEи заменить литералы этим?

constexpr int ONE = 1;
foo(x - ONE);
y = z + ONE;
bar[ONE] = y;

Повлияет ли эта замена на повышение производительности и / или уменьшение размера машинного кода в пользу снижения читабельности кода? Изменит ли число повторений литерала ответ?

0

Решение

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

Пример:

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);
}
}
}
}
3

Другие решения

Зависит. Если у вас просто есть 1s в вашем коде, и вы спрашиваете, должны ли вы заменить их: НЕ Держите ваш код в чистоте. У вас не будет никаких преимуществ по производительности или памяти — еще хуже, вы можете увеличить время сборки
Если 1Однако это параметр времени сборки: Да, пожалуйста, введите константу! Но выберите лучшее имя, чем ONE!

1

Должен ли я определить константу ONEи заменить литералы этим?

Нет, абсолютно нет. Если у вас есть имя, которое указывает на имея в виду числа (например, NumberOfDummyFoos), если его значение может измениться, и вы хотите предотвратить его обновление в дюжине мест, тогда вы можете использовать для этого постоянную, но постоянную ONE не добавляет абсолютно никакой ценности над литералом 1,

Повлияет ли эта замена на повышение производительности и / или уменьшение размера машинного кода в пользу снижения читабельности кода?

В любой реалистичной реализации это не так.

0

Замена литералов именованными константами имеет смысл,
если значение константы особенное. Замена 1 с ONE является
просто накладные расходы в большинстве случаев и не добавляет никакой полезной информации
читателю, особенно если он используется в различных функциях (указатель, часть расчета и т. д.). Если запись 1 массива является чем-то особенным, используя константу THE_SPECIAL_INDEX=1 будет иметь смысл.
Для компилятора это обычно не имеет никакого значения.

0

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

В этом случае использование ONE таким способом не является ни улучшением производительности, ни удобочитаемостью. Вот почему вы, вероятно, никогда не видели его в исходном коде;)

0
По вопросам рекламы [email protected]