Kirill
утро глупых вопросов, если сеттер создает новую сущность. например контейнер, потом уже ассайнит его в поле класса. nrvo и guaranted copy ellision все делают за меня ведь?
Kirill
нет, где там NRVO
вот return там нет, да,
Kirill
собственно но видно что скоуп заканчивается
Igor
void set() { vector<int> a; a.push_back(1); this->vec = a; }
Anonymous
Всем привет
Berkus
void set() { vector<int> a; a.push_back(1); this->vec = a; }
здесь не будет оптимизации
Anonymous
Спасибо за чат
Andrei
Igor
здесь не будет оптимизации
а мув компилятор случаем не догадается подставить?
Egor
void set() { vector<int> a; a.push_back(1); this->vec = a; }
думаю тут в итоге будет this->vec.emplace_back какой нибудь
Kirill
щас код покажу,а
Kirill
с пуш беком естественно ничего не будет
Igor
Kirill
this->vec = std::move(a); и норм же
вот вопрос был в том нужно кастить к rvalue или нет
Kirill
компилятор догадается из за guaranteed copy elision. вроде кейс не сложный
Andrei
вот вопрос был в том нужно кастить к rvalue или нет
nrvo - только при ретурнах, а guaranted copy ellision думаю тоже не должен сработать. Но ты ведь можешь к сету прикрутить или лямбду или другой метод
Andrei
а в векторе только POD типы?
🐙 Antony
компилятор догадается из за guaranteed copy elision. вроде кейс не сложный
не догадается. guaranteed copy elision работает только для prvalue, а в примере с this->vec = a; будет lvalue
Kirill
значит нужно кастить, спасибо.
Daniil
Igor
#book Scott Meyers - Effective Modern C++ / Скотт Майерс - Эффективный и современный C++; Вильямс, 2016 г.
Egor
как минимум нужен .clear() перед этим
https://godbolt.org/g/SB9hqx выделение памяти происходит один раз, со сложными структурами думаю будет emplace_back в итоге
Kirill
мной подразумевалась такая ситуация https://godbolt.org/g/cyhePY
Крылатый
мной подразумевалась такая ситуация https://godbolt.org/g/cyhePY
Шланг, кстати, всё в хлам заоптимизировал
Egor
мной подразумевалась такая ситуация https://godbolt.org/g/cyhePY
если заменить vec = std::move(a) на vec = a; на шланге и гсс ничего не поменяется
Egor
MSVC как всегда всё делает по стандарту
Berkus
мной подразумевалась такая ситуация https://godbolt.org/g/cyhePY
ну да здесь шланг должен простым lifetime analysis-ом понять что это можно схлопнуть
Anonymous
пацаны всем привет А сколько будет стоить написать регистратор для одного сайта с проксями?
Крылатый
ellcc ваще оставил только main: # @main xorl %eax, %eax retq
Kirill
шланг вообще увидел что мейн знает все в компайл тайме и...
Anonymous
или на чем лучше писать искать
Anonymous
Оффтоп
для новичков есть чат?
Anonymous
Egor
шланг вообще увидел что мейн знает все в компайл тайме и...
если не будет информации в компайлтайме - на шланге этот код до emplace развернется в любом случае
🦥Alex Fails
@supapro
это чат для новичков, да
Крылатый
https://godbolt.org/g/CXTYgY
🐙 Antony
Berkus
все очень сильно поменяется д
Egor
Как это ничего не поменятеся? https://godbolt.org/g/TpPwZ9
странно. для гсс смотрел этот же код
Anonymous
Был бы рад если бы поделились книгой об ассемблере для чайников далёких от этого
Egor
Как это ничего не поменятеся? https://godbolt.org/g/TpPwZ9
тут прикол в списке инициализации. если изменить на push_back - разницы не будет
Anonymous
Andrei
мне кажется, этот чат и @supapro сделали неплохой такой вклад в общение по С++. Раньше точно не так обильно обсуждали проблемы и решения
Anatoliy
если не будет информации в компайлтайме - на шланге этот код до emplace развернется в любом случае
Очередной раз в этом чате (для профи) утверждение о том, что какой-то код с контейнерами до emplace или emplace_back заоптимизируется, при том что нигде их вызовов нет даже неявно (по стандарту). Может кто-нибудь мне пояснить?
Anatoliy
компиляторы уже могут детектировать эквивалентные функции и принимать решение о замене одних на другие (я не про IPO, а про семантику)?
Berkus
+
Anatoliy
Это-то всё понятно. Меня интересует вообще обоснованность таких утверждений хоть какая-либо. Утверждается (в контексте, как нечто самоочевидное), что существуют какие-то вообще фантастические "оптимизации" (с изменением семантики). Как-то не верится.
Крылатый
Што.
Anatoliy
Ладно. Буду писать "што".
Anatoliy
тоже так показалось
Anatoliy
а посему мне кажется ничего плохого не будет, если слить чат с supapro
Berkus
но чтобы push_back на emplace_back менялся такого я не видел
Александр
Anatoliy
а внутри него что стоит? почему не до этого, стоящего внутри него заоптимизируется?
🦥Alex Fails
Это-то всё понятно. Меня интересует вообще обоснованность таких утверждений хоть какая-либо. Утверждается (в контексте, как нечто самоочевидное), что существуют какие-то вообще фантастические "оптимизации" (с изменением семантики). Как-то не верится.
Трудно сказать, да и не хочется говорить за всех. Подозреваю, что это связано с феноменом того, что человек увтдел работу оптимизатора, удивился, как он хитро догадался, что некие X и Y эквивалентны, и потом домысливает, чт компилятор может огадаться, что X1 эквивалентен Y1
Александр
я говорю, что push_back может заинлайниться на 1 лвл (до emplace_back)
Anatoliy
я говорю, что push_back может заинлайниться на 1 лвл (до emplace_back)
в libstdc++ или какой это? то есть в частном случае
🦥Alex Fails
Berkus
я говорю, что push_back может заинлайниться на 1 лвл (до emplace_back)
push_back внутри емплейса вижу https://github.com/llvm-mirror/libcxx/blob/master/include/vector#L679 наоборот не вижу https://github.com/llvm-mirror/libcxx/blob/master/include/vector#L1588
🦥Alex Fails
Вот оно в стикере)
Александр
на самом деле от имплементации зависит
Александр
где-то вполне может быть наоборот :)
Egor
Очередной раз в этом чате (для профи) утверждение о том, что какой-то код с контейнерами до emplace или emplace_back заоптимизируется, при том что нигде их вызовов нет даже неявно (по стандарту). Может кто-нибудь мне пояснить?
1. Оптимизировать надо только места, где оптимизация нужна. 2. Любую оптимизацию надо тестировать. 2. Про emplace контейнеров - в текущем проекте (сервер мморпг на плюсах) при старте много информации грузится из базы по подобным схемам, зачастую в итоге получается emplace. при этом замена container a = b; на container a = std::move(b) на скорость никак не влияет. Порядок - 1кк элементов
🦥Alex Fails
а посему мне кажется ничего плохого не будет, если слить чат с supapro
Не-не-не. Пусть вопросы про printf, лабы и прочие новичковские живут там, мы так долго боролись за это