Здравствуйте, Аноним, Вы писали:
А>Почему это хорошо
Разве не очевидно?
А>
А>BOOST_FOREACH(auto& file_name, files)
А>for (auto i = files.begin(); i != files.end(); i++)
А>
Первый вариант намного проще + читающий сразу понимает, что в теле foreach будет просмотрено каждое значение, без скачков.
Второй вариант — более error-prone, плюс в теле возможны скачки типа i-=10.
А>
В первом варианте нет ничего лишнего — два значения и вызов предиката — проще и быть не может (разве что специальный кроссплатформенный предикат is_dynamic_library_name, но это уже другая логика).
Во втором же варианте добавляются вычисления с жёстко прибитыми длинами, опять же более error prone.
А>"ржу не могу всем отделом LOL" ???
Ну в общем особо то не важно, но если четко брать 2ой вариант, то проблема магические числа:
а если разрешение будете искать не dll а html, а тот кто залезет в код забудет тройки поменять?
Что будет если i->size() — 3 это выражение меньше нуля?
А>for (auto i = files.begin(); i != files.end(); i++)
А>{
А> if (i->compare(i->size() - 3, 3, L"dll") == 0)
А> {
А> ...
А> }
А>}
А>
А>"ржу не могу всем отделом LOL" ???
Второй вариант оформления цикла мне нравится больше (что может понравиться в нестандартном макросе?).
А вот во втором варианте в условии, скорее всего, ошибка. Если имя файла короче трех символов мы будем иметь неопределенное поведение.
Цикл первого варианта уже можно заменить на стандартную конструкцию
for (auto& file_name : files)
> for (auto i = files.begin(); i != files.end(); i++)
end() вычисляется каждый раз, на практике эта операция не может быть закеширована в регистр или стек.
в случае первого варианта end() вычисляется оидн раз.
Здравствуйте, Аноним, Вы писали:
А>Почему это хорошо А>
А>BOOST_FOREACH(auto& file_name, files)
А>
Это плохо использованием макроса
А>а это А>
А>for (auto i = files.begin(); i != files.end(); i++)
А>
можно соптимизировать
А>
А> if (i->compare(i->size() - 3, 3, L"dll") == 0)
А>
UB, как уже было указано.
А>"ржу не могу всем отделом LOL" ???
Действительно. Оба примера содержат ошибку. Попробуйте такие имена как "ItIsNotdll", "dll".
Здравствуйте, Son of Northern Darkness, Вы писали:
SON>Обычно такое не удобно отлаживать. В каждой итерации приходится проваливаться в код std, да и читаемость ниже.
Про отладку ещё можно понять, но с читаемостью-то что?
Наоборот, ведь, выше — сразу видно что код выполнится для каждого элемента.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Про отладку ещё можно понять, но с читаемостью-то что? EP>Наоборот, ведь, выше — сразу видно что код выполнится для каждого элемента.
Здравствуйте, Son of Northern Darkness, Вы писали:
EP>>Про отладку ещё можно понять, но с читаемостью-то что? EP>>Наоборот, ведь, выше — сразу видно что код выполнится для каждого элемента. SON>Да подсветка, например.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Son of Northern Darkness, Вы писали:
EP>>>Про отладку ещё можно понять, но с читаемостью-то что? EP>>>Наоборот, ведь, выше — сразу видно что код выполнится для каждого элемента. SON>>Да подсветка, например.
EP>А что с подсветкой?
for (;) — это стандартная синтаксическая конструкция, где ключевое слово будет подсвечено соответствующим образом.
Но у меня на чтение того же куска ушло бы на несколько секунд дольше. Впрочем, мы можем сойтись на мнении, что я тупой и не понимаю лямбд.
Здравствуйте, Alexander G, Вы писали:
AG>end() вычисляется каждый раз, на практике эта операция не может быть закеширована в регистр или стек. AG>в случае первого варианта end() вычисляется оидн раз.
не совсем так.
компилятор смотрит, если по отношению к 'files' применяются только константные методы, то 'files.end()' вычисляется только один раз. (говорю про GCC)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
AG>>end() вычисляется каждый раз, на практике эта операция не может быть закеширована в регистр или стек. AG>>в случае первого варианта end() вычисляется оидн раз. X>не совсем так. X>компилятор смотрит, если по отношению к 'files' применяются только константные методы, то 'files.end()' вычисляется только один раз. (говорю про GCC)
Не может такого быть, из-за mutable или хотя бы указателей. Компилятору нужно доказать что результат не меняется.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, niXman, Вы писали:
AG>>>end() вычисляется каждый раз, на практике эта операция не может быть закеширована в регистр или стек. AG>>>в случае первого варианта end() вычисляется оидн раз. X>>не совсем так. X>>компилятор смотрит, если по отношению к 'files' применяются только константные методы, то 'files.end()' вычисляется только один раз. (говорю про GCC)
EP>Не может такого быть, из-за mutable или хотя бы указателей. Компилятору нужно доказать что результат не меняется.
Вполне может иметь место хак применительно к стандартным контейнерам у нас есть гарантия, что вызывая только конст методы контейнер останется иммьютебл.
Здравствуйте, saf_e, Вы писали:
EP>>Не может такого быть, из-за mutable или хотя бы указателей. Компилятору нужно доказать что результат не меняется. _>Вполне может иметь место хак применительно к стандартным контейнерам
Это требует кооперации между GCC и библиотекой, скорей всего каких-то атрибутов. А вот есть ли такие атрибуты?
_>у нас есть гарантия, что вызывая только конст методы контейнер останется иммьютебл.
AFAIK, не immutable, а thread-safe, что более слабая гарантия.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Не может такого быть, из-за mutable или хотя бы указателей. Компилятору нужно доказать что результат не меняется.
просто проверь.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)