vladislav
Извините, но я ору. Люблю СПб. Всех с новым годом, счастливых стандартов и документации к либам!
vladislav
Vladislav
ах, не поздравил я чатик. Всех с новым годом 😊
Присоединяйтюсь к поздравлениям :)
Alexander "SonnySlave"
http://www.bfilipek.com/2017/12/cpp-status-2017.html
Ender
А разве в штудии нет возможности к проекту на сипп винформс подключить? Там же был какой-то ГРЯЗНЫЙ ХАК с подключением винформс. Просто дело в том, что это говно депрекейтед и очевидно оно не подключается. Но можно так. Ты просто не прочитал наверное.
Ender
Wpf, WinForms выбирай не хочу
Ender
Ой
Ender
С Новым Годом
Anonymous
Как скомпилировать ffmpeg с swscale на windows под mingw? Просто ./configure --enable-swscale && make && make install завершается успешно, но swscale в итоге всё равно нет.
Ioann_
Ребята а это rvo: ? std::string c(a + b) Где а и b это std string.
Ioann_
?
Ioann_
В книге написано что рво это замена инициализации копированием - прямой инициализацией в контексте возвращаемого значения
Ioann_
А в данном случае, вроде как прямой инициализации не будет, но объект а + b может быть сконструирован прямо в c
Ioann_
Или это и будет прямая инициализация ? Лал ?
Anton
Ребята а это rvo: ? std::string c(a + b) Где а и b это std string.
Не совсем понятно, что имеется в виду. Где конструктор разместит объект там он и будет. Он же не конструирует объект, а потом отдаёт его копию
Surreal
+ возвращает новую строку. Вопрос, видимо, в том, где она будет сконструирована: в c, или сначала в tmp, потом в c.
Surreal
Это implementation defined, скорее всего.
Anton
+ возвращает новую строку. Вопрос, видимо, в том, где она будет сконструирована: в c, или сначала в tmp, потом в c.
Аа. Ну тут слишком много "хопов" для rvo, не? Благодаря rvo результат + будет сразу положен по адресу аргумента для конструктора. Но не "дальше". Так что наверное это уже про оптимизации компилятора
Surreal
Я подозреваю, что для кейса c(a + b) есть спец. оптимизации у всех компиляторов. А так, +, вроде, аналогичен string(a).append(b) и без tmp строки вполне можно обойтись, но внутри там еще что-то более оптимальное, наверняка.
Anton
Надо на годболте повертеть, в какой код эти случаи развернутся. Но лень
Ioann_
Так как автор дает определение rvo такое
Ioann_
То что тут оптимизируется я знаю, так как уже сто лет этим пользуюсь. Вопрос в том как эта оптимизация называется корректно если иисходить из определения выше
Anton
Так как автор дает определение rvo такое
*... в контексте возвращаемого значения* А этот случай выходит за контекст возвращаемого значения из оператора +. Т.е. объект, созданный внутри оператора конечно будет помещён по адресу возврата, но его дальнейшая судьба уже вне "компетенции" rvo Наверное как-то так
Andrei
Вопрос в том есть ли это rvo
Если говорить о c++11 и старше, то вызывается конструктор перемещения
Andrei
в целом, это должно быть rvo. Возврат из функции временного объекта
Andrei
*... в контексте возвращаемого значения* А этот случай выходит за контекст возвращаемого значения из оператора +. Т.е. объект, созданный внутри оператора конечно будет помещён по адресу возврата, но его дальнейшая судьба уже вне "компетенции" rvo Наверное как-то так
operator+ просто функция, которая возвращает временное значение. Поэтому создастся объект, а потом не будет два копирования/перемещения, а будет одно в данном случае, без копирования/перемещения на стек
Andrei
более того. копирования не будет и временного объекта тоже. operator+ скорее всего вызывает конструктор с нужным значением, поэтому компилятор сконструирует объект сразу в нужном месте
Andrei
Если говорить о c++11 и старше, то вызывается конструктор перемещения
а это в плане что в целом все равно на rvo, так как там пару операций на перемещение..
Surreal
а это в плане что в целом все равно на rvo, так как там пару операций на перемещение..
Действительно, чего нам стоит лишний раз конструктор и деструктор вызывать - ничего же, циклы же бесплатные.
Ignat
если ты посмотришь на сгенерированный типичным конпелятором ачм, то увидишь, что там достаточно много лишних инструкций, которые, тем не менее, действительно жрут твои драгоценные ЦИКЛЫ
Surreal
Именно для кейса string c(a+b)?
Surreal
Там минимум rvo, а в идеале что-то еще более мудреное, т.к. кейс достаточно распространен, чтобы намутить специальную оптимизацию.
Ignat
полагаю, между различными basic blocks несколько бесполезных инструкций нагенерится, да
Ignat
ну очевидно основное время ты в любом случае проведёшь в operator+
Andrei
Действительно, чего нам стоит лишний раз конструктор и деструктор вызывать - ничего же, циклы же бесплатные.
Так объект вче равно создавать надо. Один рас создастся, а потом дважды переместится (просто смена указателей), если не брать в расчет rvo
Ignat
(если не вброса ради, а правда интересно, то сравни сгенерированный код: https://godbolt.org/g/88GGyL)
Surreal
Я уже посмотрел давно. Я не понимаю, что вы подразумеваете под лишними инструкциями.
Ignat
Я уже посмотрел давно. Я не понимаю, что вы подразумеваете под лишними инструкциями.
Сходу в глаза в шаблонном коде не бросаются в силу того, что control flow достаточно сложный. Тем не менее, известно, что компиляторы хорошо умеют оптимизировать инструкции внутри так называемых basic blocks, но плохо между ними, и иногда получается так, что какой-нибудь несчастный mov из-за этого дублируется, например
Anonymous
привет кто нить знает как по быстрому преобразовать код на асме в массив опкодов? и еще, почему msvc++ компилер не дает юзать asm {} вставки?
Anonymous
точнее у в мсвц есть __asm но он работает только на x86, если компилить под х64 то он дает ошибку
Stanislav
либо внешний асм прикостыливать
Anonymous
а как теперь мне делать свои асм вставки?)
mishipeshu
/stat@combot
Anonymous
JIT компилить ассемблер?)
Stanislav
а как теперь мне делать свои асм вставки?)
никак, брать yasm/nasm и писать функции которые уже вызывать из С++
Ignat
видимо, скорее masm
Anonymous
нахуя они его выкинули?
Ignat
а нахуя они нужны?
Anonymous
а почему нет?
Anonymous
для кучи вещей
Ignat
а почему не добавить в стандарт 2D графику на основе Cairo, например?
Ignat
oh wait...
Stanislav
а почему нет?
https://docs.microsoft.com/en-us/cpp/build/intrinsics-and-inline-assembly
Stanislav
теперь вопрос, нахер встроенный асм?
Anonymous
хз))
Ignat
а почему нет?
видимо, компилятору сильно приятнее работать с семантикой С++ без ограничений, накладываемых асмом
Anonymous
например, каких?)
Stanislav
интринсики хотя бы меж компиляторами совместими
Ignat
ну в смысле
Ignat
если у тебя семантика volatile asm или как там это называется
Ignat
то с ним делать нельзя вообще ничего
Stanislav
а то понапишут инлайн асм, который потом никуда не портанешь
Ignat
ну это проблемы разработчиков, казалось бы
Anonymous
@crackedmind а это ты меня прошлый раз банил?
Ignat
банить за инлайн асм — звучит как неплохой план!
Anonymous
та не, я по читам спрашивал
Anonymous
какой то из одменов сагрился на это оч серьезно
Anonymous
мол читы == плоха
Ioann_
а нахуя они нужны?
Потому что мсвц инвалид
Berkus
та не, я по читам спрашивал
читы == плоха, хочешь опять бан?
Ignat
Потому что мсвц инвалид
не понел логического перехода, можно поподробнее?
Stanislav
Потому что мсвц инвалид
отсутстиве инлайн асма признак инвалидства?
Ioann_
Ну мсвц плохо оптимизирует код, как быть когда у тебя есть версия оптимизированного кода и ты ее хочешь использовать ?