CppCheck. Область действия переменной может быть уменьшена (и цикл)

CppCheck находит мне некоторые выводы, например: «Область действия переменной« x »может быть уменьшена».

Что делать, если у меня такая ситуация:

int x;
for (int i = 0; i != 10; ++i)
{
x = someFunction();

// ... I use x variable here
}

Я думаю, что мой код в порядке. Как вы думаете? Должно ли это измениться на что-то подобное?

for (int i = 0; i != 10; ++i)
{
int x = someFunction();

// ... I use x variable here
}

Во втором коде переменная x определена для всей итерации … Я думаю, это не совсем нормально (не оптимально).

5

Решение

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

5

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

положение int декларация не влияет на производительность, поэтому Cppcheck прав, когда поднимает эту проблему стиля. Эта проблема стиля может быть применена и к нетривиальным типам,

for (int i = 0; i != 10; ++i)
{
MyType x = someFunction();

// ... I use x variable here
}

поскольку конструкторы, как правило, так же эффективны, как и присваивания. Начиная с версии 1.65, Cppcheck, кажется, не различает тривиальные и нетривиальные типы.

Но не следует слепо следовать таким советам по стилю, будут случаи нетривиальных типов, когда назначение более эффективно, чем построение. (Как обычно: если сомневаетесь в производительности, измерьте!)

4

Как уже упоминалось, для тривиальных типов это вряд ли окажет существенное влияние на производительность.

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

Оба из них могут быть важны при рассмотрении ремонтопригодности.

Мы все знаем, что мы должны держать функции короткими и хорошо рефакторизованными, но мы все видели тех монстров длиной 5000 строк, где переменная была объявлена ​​вверху и использовалась один раз, 3789 строк. А если нет, пожалейте остальных из нас.

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