2016-02-17 3 views
0

У меня есть пример кода вроде этого, в котором буквально 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

Я рекомендую: Просто просмотрите обе версии и узнайте сами. – MrSmith42

ответ

3

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

Пример:

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

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

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

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

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

0

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

1

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

0

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

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

Смежные вопросы