Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
1

Оптимизация цикла for

27.11.2015, 02:39. Просмотров 398. Ответов 14
Метки нет (Все метки)

Исходные данные: имеется цикл for, прерывание которого невозможно(должен выполнить все итерации).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int main()
{
   bool flag = false;
   
   for(int i = 0; i < 4; ++i)
   {
       if(i % 4 == 0)
       {
           flag = true;
       }
   }
   
   std::cout << flag;
}
Переприсваивание
C++
1
flag = true;
произойдет столько, сколько выполниться условие. Предусмотрена ли оптимизация для встроенных типов - игнорирование многократного присваивания одного и того же значения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2015, 02:39
Ответы с готовыми решениями:

Оптимизация цикла for
Скажите, пожалуйста, как оптимизируется первый цикл? И чем он отличается от...

Оптимизация цикла по скорости
Помогите пожалуйста оптимизировать данный цикл (изменить его, чтобы он...

Оптимизация условия цикла while
Доброго времени суток, друзья! Я еще совсем новичок в С++. Подскажите плз как...

Оптимизация цикла (перебор 5000000 элементов)
Можно ли как-то оптимизировать данный цикл? for (i=10000000; i&lt;15000000; i++)...

Применение цикла if для определения простых чисел. If внутри цикла for
Доброго времени суток, подскажите пожалуйста, в чем тут дело. С кодом все...

14
sourcerer
Модератор
Эксперт CЭксперт С++
4863 / 2044 / 325
Регистрация: 20.02.2013
Сообщений: 5,545
Записей в блоге: 24
Завершенные тесты: 1
27.11.2015, 06:42 2
Хулиган, эту "оптимизацию" можно легко самостоятельно реализовать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int main()
{
    bool flag = false;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4 && !flag)
        {
            flag = true;
        }
    }
 
    std::cout << flag;
 
    return 0;
}
Проверяем, правда ли один раз входит в тело оператора if:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
{
    bool flag = false;
    int how_many_times = 0;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4 && !flag)
        {
            flag = true;
            ++how_many_times;
        }
    }
 
    std::cout << flag << " " << how_many_times;
 
    return 0;
}
Добавлено через 7 минут
Только для наглядности лучше количество витков цикла сделать побольше, скажем, 16 итераций, а не 4.
2
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 11:49  [ТС] 3
Цитата Сообщение от gru74ik Посмотреть сообщение
эту "оптимизацию" можно легко самостоятельно реализовать
а так можно сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int main()
{
    bool flag = false;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4)
        {
            static bool tmp = flag = true;
        }
    }
 
    std::cout << flag;
 
    return 0;
}
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
27.11.2015, 11:51 4
Цитата Сообщение от Хулиган Посмотреть сообщение
C++
1
2
3
4
if(i % 4 && !flag)
{
    static bool tmp = flag = true;
}
tmp будет видна только в этом блоке, зачем ее статической делать? static - это класс хранения, другими словами, это назначение переменной времени жизни до конца работы программы. Зачем это здесь используется - не понятно.
0
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 11:54  [ТС] 5
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
tmp будет видна только в этом блоке, зачем ее статической делать?
C++
1
2
3
4
if(i % 4)
{
     static bool tmp = flag = true;
}
присваивание tmp = flag = true, выполниться только один раз при инициализации статической переменной(я так думаю, надо проверить)
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.11.2015, 12:06 6
Хулиган,
C++
1
2
3
4
if(min % divider == 0 || divider >= (max - min))
{
    flag = true;
}
Пойдет?

Добавлено через 3 минуты
а нет, не пойдет.
0
Erkebulan04
3 / 3 / 0
Регистрация: 20.11.2015
Сообщений: 25
27.11.2015, 21:11 7
Цитата Сообщение от Хулиган Посмотреть сообщение
for(int i = 0; i < 4; ++i)
может быть тут меньше 5, так как ты делишь число на 4
если последний число делится на 4 то выйдет true
0
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 22:03  [ТС] 8
Цитата Сообщение от Erkebulan04 Посмотреть сообщение
может быть тут меньше 5, так как ты делишь число на 4
да какая вообще разница, смысл не в этом. ну и см. ответ#3

Добавлено через 47 минут
Как и ожидалось присваивание выполняется всего лишь один раз, без необходимости дополнительных условий.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
class A
{
public:
    A& operator=(const A&)
    {
        std::cout << "operator =" << std::endl;
        return *this;
    }
};
 
int main()
{
    A flag;
    A next_value;
 
    for(int i = 0; i < 4; ++i)
    {
        if(i % 4)
        {
            static A tmp = flag = next_value;
        }
    }
}
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
27.11.2015, 22:05 9
Хулиган, язык сам по себе естественно никаких подобных оптимизаций не определяет.
+ пример неудачный: можно смело инициализировать flag = true и цикл будет не нужен.
0
Хулиган
27.11.2015, 22:09  [ТС]
  #10

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
можно смело инициализировать flag = true и цикл будет не нужен.
надо было массив случайных чисел взять)

0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
27.11.2015, 22:24 11
Цитата Сообщение от Хулиган Посмотреть сообщение
Как и ожидалось присваивание выполняется всего лишь один раз
А оно того стоит? Ведь переменная больше нигде не сможет быть использованной, а жива будет, пока программа не завешится.
0
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 22:29  [ТС] 12
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А оно того стоит? Ведь переменная больше нигде не сможет быть использованной, а жива будет, пока программа не завешится.
Цитата Сообщение от Хулиган Посмотреть сообщение
а так можно сделать?
без понятия, поэтому и спрашиваю
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
27.11.2015, 23:00 13
Цитата Сообщение от Хулиган Посмотреть сообщение
без понятия, поэтому и спрашиваю
если это какая-то POD-переменная, и такой цикл больше нигде или редко встречается в программе, то можно и так, конечно, но выглядит очень странно. Я бы лучше обратил внимание на пример, который предложил gru74ik.
0
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
27.11.2015, 23:11  [ТС] 14
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Я бы лучше обратил внимание на пример, который предложил gru74ik
ну так там выполняется лишняя проверка, которая в худшем случае удвоит время if'a, в с++ не существует ли таких конструкций, которые позволили бы выполнить только один раз кусок кода и в дальнейшем его игнорировать?
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.11.2015, 23:35 15
Цитата Сообщение от Хулиган Посмотреть сообщение
в с++ не существует ли таких конструкций, которые позволили бы выполнить только один раз кусок кода и в дальнейшем его игнорировать?
Инициализация локальной статической переменной. Собственно это уже было у тебя написано кодом.
0
27.11.2015, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2015, 23:35

Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла.
Используя одну переменную цикла укажите возможные способы объявления заголовка...

вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле цикла
вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с...

Нахождение отрицательного цикла в графе и вывод цикла
Вот программа по нахождению отрицательного цикла в графе и вывод цикла void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru