Форум программистов, компьютерный форум CyberForum.ru

расчёт значений переменных - C++

Восстановить пароль Регистрация
 
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.12.2012, 10:54     расчёт значений переменных #1
Здравствуйте!Возник вопрос касательно перерасчета переменных в цикле.
Допустим, у нас есть код
C++
1
2
string mas;
for(int i=0;i<mas.size();i++)
Будет ли программа на каждой итерации цикла переасчитывать значение mas.size() или компилятор это оптимизирует это както.Или же всё же будет лучше записать так:
C++
1
2
3
string mas;
int j=mas.size();
for(int i=0;i<j;i++)

Та же ситуация и касательно простых выражений.Как лучше записывать:
C++
1
2
int n;
for(int i=0;i<n-1;i++)
или же так
C++
1
2
3
int n;
int j=n-1;
for(int i=0;i<j;i++)
Распишите пожалуйста поподробнеее данную тему.Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11813 / 6792 / 769
Регистрация: 27.09.2012
Сообщений: 16,856
Записей в блоге: 2
Завершенные тесты: 1
07.12.2012, 11:12     расчёт значений переменных #2
Не совсем удачный пример, но:
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
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <ctime>
class C{
public:
    C(){_size=20;}
    int size(){std::cout<<"\treturn size\n"; return _size;}
private:
    int _size;
};
 
int main(){
    C c;
    for(int i=0;i<c.size();++i);
    int n=100;
    int a=50;
    clock_t start,finish;
    start=clock();
    for(int l=0;l<10;++l)
        for(int i=0;i<n*n;++i)
            for(int j=0;j<n*n;++j)
                a=j*10;
    finish=clock();
    std::cout<<"Time 1: "<<finish-start<<std::endl;
    n=100*100;
    start=clock();
    for(int l=0;l<10;++l)
        for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
                a=j*10;
    finish=clock();
    std::cout<<"Time 2: "<<finish-start<<std::endl;
    std::cin.get();
    return 0;
}
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.12.2012, 16:26  [ТС]     расчёт значений переменных #3
Croessmah, не могли бы вы поподробнее обьяснить.А то честно говоря, не совсем понимаю...
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
07.12.2012, 16:33     расчёт значений переменных #4
Относительно функции, будет на каждой итерации вызывать функцию size. Я считаю, что второй вариант предпочтительней.
Относительно второй ситуации нет ни какой разницы, есть разница в том как ты оформляешь код и как удобней тебе и тем людям, кто будет его смотреть.
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
07.12.2012, 17:29     расчёт значений переменных #5
Написал вот такой код для теста:

Кликните здесь для просмотра всего текста
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
 
class Test
{
public:
    Test():_size(25){}
    int size();
private:
    int _size;
};
 
int Test::size()
{
    return _size;
}
 
class Test2
{
public:
    Test2(int x):_size(x){}
    int size();
private:
    int _size;
};
 
int Test2::size()
{
    return _size;
}
 
int main()
{
    Test test;
    for(int i=0; i < test.size(); i++)
        std::cout<<i<<std::endl;
 
    Test2 test2(15);
 
    for(int i=0; i < test2.size(); i++)
        std::cout<<i<<std::endl;
 
    int x = 0;
    std::cin>>x;
 
    for(int i=0; i < x-1; i++)
        std::cout<<i<<std::endl;
 
 
    int z = 0;
    std::cin>>z;
    Test2 tst2(z);
 
    for(int i=0; i < tst2.size(); i++)
        std::cout<<i<<std::endl;
 
    std::string s;
    std::getline(std::cin, s);
    
    for(int i=0; i < s.size(); i++)
        std::cout<<i<<std::endl;
    }


В итоге во всех случаях компилятор вынес вычисление из цикла. Т.е. там где константа (известна на момент компиляции) - подставил константу. Там, где значение не известно - вычислил до входа в цикл (VS2012, ICC).
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11813 / 6792 / 769
Регистрация: 27.09.2012
Сообщений: 16,856
Записей в блоге: 2
Завершенные тесты: 1
07.12.2012, 17:32     расчёт значений переменных #6
Цитата Сообщение от David Sylva Посмотреть сообщение
Относительно второй ситуации нет ни какой разницы, есть разница в том как ты оформляешь код и как удобней тебе и тем людям, кто будет его смотреть.
а как же вычисление n-1 на каждой итерации цикла?
David Sylva
07.12.2012, 17:34     расчёт значений переменных
  #7

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
а как же вычисление n-1 на каждой итерации цикла?
Согласен, тупанул.

Yandex
Объявления
07.12.2012, 17:34     расчёт значений переменных
Ответ Создать тему
Опции темы

Текущее время: 12:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru