| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > размер вектора в цикле |
| Автор: mrgloom 21.6.2011, 11:00 | ||||
оптимизируется ли компилятором код
или надо
|
| Автор: triclosan 21.6.2011, 11:09 |
| вектор "знает" о своем размере, vec.size() не считает а всего лишь возвращает значение поєтому накладные расходы не большие, а читаемость кода лучше. Добавлено через 1 минуту и 37 секунд Такое навряд ли оптимизируется компилятором, откуда компилятору знать, что надумает вернуть метод класса |
| Автор: borisbn 21.6.2011, 11:15 |
| mrgloom, если вектор (вернее его размер) в цикле изменяется, то стОит делать i < vec.size(). В противном же случае - как нравится. Я, например, завожу переменную (типа size у тебя). Так проще отлаживаться - остановился на breakpoint'е и смотришь эту переменную... на вкус и цвет... |
| Автор: asmdzen 21.6.2011, 11:19 | ||||
triclosan, вот что я нашел в stl_vector.h
если размер достаточно большой - получится довольно много вычислений. обычно когда не имеет значения я прохожу контейнеры в обратном направлении, типа
|
| Автор: mrgloom 21.6.2011, 11:28 | ||
не понял смысл |
| Автор: asmdzen 21.6.2011, 11:40 | ||||
это уже просто vector.h, поскольку функция написана прямо в классе то я думаю получится прямое обращение к переменной _Mysize класса vector, значит оптимизация есть. что именно не понятно? если использовать
то метод size() будет вызван только один раз. |
| Автор: azesmcar 21.6.2011, 12:37 |
это надо смотреть на конкретно компиляторе, но писать так все равно не стоит. для итерации по вектору существуют итераторы. |
| Автор: borisbn 21.6.2011, 12:42 |
ээээххххх, опоздал я. хотел то же самое сказать. ну, тогда, просто +1 за итераторы |
| Автор: boostcoder 21.6.2011, 14:04 | ||||
на gcc-4.5.2, этот код:
генерируется в такой ассемблер:
в esi лежит размер. как не сложно заметить, vector::size() в цикле не вызывается. |
| Автор: borisbn 21.6.2011, 14:16 | ||
хммм. а если в цикл вставить
? |
| Автор: boostcoder 21.6.2011, 14:17 |
| скажу даже больше: как показывает практика, gcc компиляторы в условии цикла не вызывают функцию/метод, а вызывают ее/его один раз при инициализации. Добавлено через 25 секунд чичас |
| Автор: fish9370 21.6.2011, 14:25 |
| хочу лишь добавить, что такая функция (функция, которая не изменяет своего значения при вызовах с одним и тем же агрументом) называется чистой (pure) и разумеется компилятор впервую очередь выносит ее за цикл.. у gcc есть расширение, которое позволяет принудительно объявить функцию чистой, на случай если вы не доверяете компилятору.. |
| Автор: boostcoder 21.6.2011, 14:29 | ||||||
| а тут все еще интересней код:
получилось такое:
в esi размер. ebx - индекс. ну, выскажите свое мнение относительно плохого оптимизатора Добавлено через 2 минуты и 5 секунд вот:
Добавлено через 3 минуты и 47 секунд ааа, она уже есть выше) и никакого pure. |
| Автор: fish9370 21.6.2011, 14:48 | ||
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
|
| Автор: boostcoder 21.6.2011, 14:50 |
| fish9370, я в курсе. я вам показал, что никакого pure у метода size() нет. |
| Автор: fish9370 21.6.2011, 14:53 |
повторяю, его нет потому-что компилятор ее (функцию) и так определяет как чистую.. это ответ на вопрос топикстартера.. |
| Автор: bsa 21.6.2011, 15:07 |
| fish9370, твоя цитата к классам не относится. |
| Автор: fish9370 21.6.2011, 15:07 |
это относится ко всему.. |
| Автор: boostcoder 21.6.2011, 15:19 |
к чему тогда приведена цитата? а на основании чего компилятор принимает решение о том что она чистая? и как он может это сделать, если к примеру, он видит только декларацию(не в этом примере)? |
| Автор: fish9370 21.6.2011, 15:22 |
ну, это применять я никого не обязываю, это было приведено в позновательных целях.. суть от этого не меняется.. PS, может я вам кайф обламал, а вы хотели еще погадать на ассемблерной гуще? - тогда я прошу прощения.. а вообще бы плюсонуть не помешало бы.. |
| Автор: boostcoder 21.6.2011, 15:39 |
из какой версии STL этот код? |
| Автор: asmdzen 21.6.2011, 15:40 |
| boostcoder, той что идет с VC 2008 |
| Автор: boostcoder 21.6.2011, 15:41 |
| asmdzen, а разве тогда еще использовались расширения файлов у STL ? по моему нет... |
| Автор: triclosan 21.6.2011, 15:49 | ||
для sdt::vector<bool> |
| Автор: borisbn 21.6.2011, 16:20 |
фигасе... это v.pop_back() ??? +10050 тогда gcc |