![]() |
|
Модераторы: bsa |
![]()
|
|
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
оптимизируется ли компилятором код
или надо
|
||||
|
|||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
вектор "знает" о своем размере, vec.size() не считает а всего лишь возвращает значение поєтому накладные расходы не большие, а читаемость кода лучше.
Добавлено через 1 минуту и 37 секунд Такое навряд ли оптимизируется компилятором, откуда компилятору знать, что надумает вернуть метод класса |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
mrgloom, если вектор (вернее его размер) в цикле изменяется, то стОит делать i < vec.size(). В противном же случае - как нравится. Я, например, завожу переменную (типа size у тебя). Так проще отлаживаться - остановился на breakpoint'е и смотришь эту переменную...
на вкус и цвет... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
triclosan, вот что я нашел в stl_vector.h
если размер достаточно большой - получится довольно много вычислений. обычно когда не имеет значения я прохожу контейнеры в обратном направлении, типа
|
||||
|
|||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
||||
|
||||
| asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
это уже просто vector.h, поскольку функция написана прямо в классе то я думаю получится прямое обращение к переменной _Mysize класса vector, значит оптимизация есть. что именно не понятно? если использовать
то метод size() будет вызван только один раз. |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
ээээххххх, опоздал я. хотел то же самое сказать. ну, тогда, просто +1 за итераторы -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
на gcc-4.5.2, этот код:
генерируется в такой ассемблер:
в esi лежит размер. как не сложно заметить, vector::size() в цикле не вызывается. |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
хммм. а если в цикл вставить
? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
скажу даже больше: как показывает практика, gcc компиляторы в условии цикла не вызывают функцию/метод, а вызывают ее/его один раз при инициализации.
Добавлено через 25 секунд чичас |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
хочу лишь добавить, что такая функция (функция, которая не изменяет своего значения при вызовах с одним и тем же агрументом) называется чистой (pure) и разумеется компилятор впервую очередь выносит ее за цикл..
у gcc есть расширение, которое позволяет принудительно объявить функцию чистой, на случай если вы не доверяете компилятору.. -------------------- undefined |
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
а тут все еще интересней
код:
получилось такое:
в esi размер. ebx - индекс. ну, выскажите свое мнение относительно плохого оптимизатора Добавлено через 2 минуты и 5 секунд вот:
Добавлено через 3 минуты и 47 секунд ааа, она уже есть выше) и никакого pure. |
||||||
|
|||||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
Это сообщение отредактировал(а) fish9370 - 21.6.2011, 14:49 -------------------- undefined |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
fish9370, я в курсе.
я вам показал, что никакого pure у метода size() нет. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |