Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> размер вектора в цикле 
:(
    Опции темы
mrgloom
Дата 21.6.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет




оптимизируется ли компилятором код
Код

for (int i=0;i<vec.size();++i)
{}


или надо 
Код

int size= vec.size();
for (int i=0;i<size;++i)
{}



PM MAIL   Вверх
triclosan
Дата 21.6.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



вектор "знает" о своем размере, vec.size() не считает а всего лишь возвращает значение поєтому накладные расходы не большие, а читаемость кода лучше.

Добавлено через 1 минуту и 37 секунд
Цитата(mrgloom @  21.6.2011,  11:00 Найти цитируемый пост)
оптимизируется ли компилятором код

Такое навряд ли оптимизируется компилятором, откуда компилятору знать, что надумает вернуть метод класса 
PM MAIL   Вверх
borisbn
Дата 21.6.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



mrgloom, если вектор (вернее его размер) в цикле изменяется, то стОит делать i < vec.size(). В противном же случае - как нравится. Я, например, завожу переменную (типа size у тебя). Так проще отлаживаться - остановился на breakpoint'е и смотришь эту переменную...

Цитата(triclosan @  21.6.2011,  11:09 Найти цитируемый пост)
а читаемость кода лучше

на вкус и цвет...




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
asmdzen
Дата 21.6.2011, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



triclosan, вот что я нашел в stl_vector.h
Код

      /**  Returns the number of elements in the %vector.  */
      size_type
      size() const
      { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }


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

for (int i=vec.size() - 1;i>=0;--i)
{}

PM MAIL   Вверх
mrgloom
Дата 21.6.2011, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата(asmdzen @  21.6.2011,  11:19 Найти цитируемый пост)
обычно когда не имеет значения я прохожу контейнеры в обратном направлении
for (int i=vec.size() - 1;i>=0;--i)


не понял смысл

Это сообщение отредактировал(а) mrgloom - 21.6.2011, 11:39
PM MAIL   Вверх
asmdzen
Дата 21.6.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Код

size_type size() const
        {    // return length of sequence
        return (_Mysize);
        }


это уже просто vector.h, поскольку функция написана прямо в классе то я думаю получится прямое обращение к переменной _Mysize класса vector, значит оптимизация есть.
Цитата(mrgloom @  21.6.2011,  11:28 Найти цитируемый пост)
не понял смысл 

что именно не понятно? если использовать 
Код

for (int i=vec.size() - 1;i>=0;--i)

то метод size() будет вызван только один раз.

PM MAIL   Вверх
azesmcar
Дата 21.6.2011, 12:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(mrgloom @  21.6.2011,  11:00 Найти цитируемый пост)
оптимизируется ли компилятором код

это надо смотреть на конкретно компиляторе, но писать так все равно не стоит.
для итерации по вектору существуют итераторы.
PM   Вверх
borisbn
Дата 21.6.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(azesmcar @  21.6.2011,  12:37 Найти цитируемый пост)
для итерации по вектору существуют итераторы

ээээххххх, опоздал я. хотел то же самое сказать.
ну, тогда, просто +1 за итераторы smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 21.6.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



на gcc-4.5.2, этот код:
Код

int main(int argc, char * argv[])
{
   int s = rand()%10;
   printf("%d\n", s);
   std::vector<int> v(s);
   
   for(int idx = 0; idx < v.size(); ++idx) {
      printf("idx: %d", idx);
   }
}


генерируется в такой ассемблер:
Код

004013B0 loc_4013B0:
004013B0 mov     [esp+20h+var_1C], ebx // аргумент для printf`a
004013B4 mov     [esp+20h+var_20], offset aIdxD ; "idx: %d" // форматная строка
004013BB call    printf
004013C0 inc     ebx // инкремент
004013C1 cmp     esi, ebx // сравнение
004013C3 ja      short loc_4013B0 // повторяем

в esi лежит размер.
как не сложно заметить, vector::size() в цикле не вызывается.

PM WWW   Вверх
borisbn
Дата 21.6.2011, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(boostcoder @  21.6.2011,  14:04 Найти цитируемый пост)
как не сложно заметить, vector::size() в цикле не вызывается.

хммм. а если в цикл вставить
Код
v.pop_back();

?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 21.6.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



скажу даже больше: как показывает практика, gcc компиляторы в условии цикла не вызывают функцию/метод, а вызывают ее/его один раз при инициализации.

Добавлено через 25 секунд
Цитата(borisbn @  21.6.2011,  14:16 Найти цитируемый пост)
а если в цикл вставить

чичас smile
PM WWW   Вверх
fish9370
Дата 21.6.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



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

у gcc есть расширение, которое позволяет принудительно объявить функцию чистой, на случай если вы не доверяете компилятору.. 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 21.6.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



а тут все еще интересней smile
код:
Код

int main(int argc, char * argv[])
{
   int s = rand()%10;
   printf("%d\n", s);
   std::vector<int> v(s);
   
   for(int idx = 0; idx < v.size(); ++idx) {
      v.pop_back();
      printf("idx: %d", idx);
   }
}



получилось такое:
Код

004013B0 loc_4013B0:
004013B0 sub     esi, 4
004013B3 mov     [esp+20h+var_1C], ebx
004013B7 mov     [esp+20h+var_20], offset aIdxD ; "idx: %d"
004013BE call    printf
004013C3 inc     ebx
004013C4 mov     eax, esi
004013C6 sub     eax, edi
004013C8 sar     eax, 2
004013CB cmp     eax, ebx
004013CD ja      short loc_4013B0

в esi размер.
ebx - индекс.


ну, выскажите свое мнение относительно плохого оптимизатора smile

Добавлено через 2 минуты и 5 секунд
Цитата(fish9370 @  21.6.2011,  14:25 Найти цитируемый пост)
называется чистой (pure)

вот:
Код

      // [23.2.4.2] capacity
      /**  Returns the number of elements in the %vector.  */
      size_type
      size() const
      { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }



Добавлено через 3 минуты и 47 секунд
ааа, она уже есть выше)
и никакого pure.

PM WWW   Вверх
fish9370
Дата 21.6.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

Код

pure
Many functions have no effects except the return value and their return value depends only on the parameters and/or global variables. 
Such a function can be subject to common subexpression elimination and loop optimization just as an arithmetic operator would be. 
These functions should be declared with the attribute pure. For example,
          int square (int) __attribute__ ((pure));


Это сообщение отредактировал(а) fish9370 - 21.6.2011, 14:49


--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 21.6.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



fish9370, я в курсе.
я вам показал, что никакого pure у метода size() нет.

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.