Size: a a a

2020 June 20

AT

Andrew Titov in pro.cxx
Eugene Zhulenev
а если функция помечена inline то похоже символ для нее можно не герерить если не осталось call сайтов
Ещё немного об этом:
https://t.me/ProCxx/375199
источник

m

magras in pro.cxx
osm1um
Ребята, есть небольшой топик который жутко сложно, долго разбирать (по крайней мере для меня).

Увидел парня, который нарисовал абсолютно на каждой функции в своей программе inline. Аргументирует это тем, что мы избавляемся от накладных расходов при вызове call.

*Чтобы сказать глупость нужно мало времени, а чтобы объяснить...* (а может я глупый)

Вот есть у нас inline, который рекомендует компилятору перенести тело функции в место вызова, что технически избавляет нас от лишней call инструкции. Но не должно же оно так работать!

*Я понимаю, что функции в 5000 строк переносить - плохая затея. Билд в 2ГБ никому не нужен. Но всё же, в относительно небольших проектах это может давать хоть какой-то значительный прирост?*

Вроде всё логично, но жутко глупо одновременно 🙃

Объясните как вообще понимать подобные вещи, я вот сижу и понять не могу. Тесты пока не проводил, да и кажется мне, что всё будет на уровне погрешности...
Есть классический пример, когда inline вреден:

std::error_code error = DoSomething();
if (error) { HandleError(error); }

Если ошибки являются редким кейсом мы засоряем функцию кодом, который почти никогда не будет исполнятся, но будет съедать кэш.
источник

m

magras in pro.cxx
Кстати, можно заметить, что у исключений такой проблемы нет и код обработки ошибок у нас по-умолчанию вынесен из функции. =)
источник

RR

Roman Rubanenko in pro.cxx
magras
Есть классический пример, когда inline вреден:

std::error_code error = DoSomething();
if (error) { HandleError(error); }

Если ошибки являются редким кейсом мы засоряем функцию кодом, который почти никогда не будет исполнятся, но будет съедать кэш.
Любопытно, будут ли атрибуты likely/unlikely помогать с этим
источник

m

magras in pro.cxx
Roman Rubanenko
Любопытно, будут ли атрибуты likely/unlikely помогать с этим
Я же про инлайн HandleError(), а не branch prediction. Я сомневаюсь, что likely/unlikely влияют на инлайнинг.
источник

RR

Roman Rubanenko in pro.cxx
magras
Я же про инлайн HandleError(), а не branch prediction. Я сомневаюсь, что likely/unlikely влияют на инлайнинг.
Я понимаю, но кажется ничего не запрещает использовать явно указанный разработчиком атрибут для оптимизации инлайнов
источник

m

magras in pro.cxx
Roman Rubanenko
Я понимаю, но кажется ничего не запрещает использовать явно указанный разработчиком атрибут для оптимизации инлайнов
В clang'е кажется, это можно проверить. У него были флаги, которые показывают при компиляции inline score и пороги.
источник

S

Serg in pro.cxx
`__attribute__((always_inline))`   или __forceinline ?
источник

RR

Roman Rubanenko in pro.cxx
magras
В clang'е кажется, это можно проверить. У него были флаги, которые показывают при компиляции inline score и пороги.
Не знал про это, спасибо!
источник

m

magras in pro.cxx
Ну и к слову, я сейчас на всякий пожарный еще раз проверил и clang 10 повышает threshold для inline функций. Так что это не совсем правда, что inline не влияет на оптимизатор.
источник

m

magras in pro.cxx
А вот likely/unlikely никак не влияют на порог: https://godbolt.org/z/xdno3f
источник

YB

Yura Blok in pro.cxx
Про влияние inline есть хороший доклад: https://youtu.be/7nYfsiDGbak?t=341
источник

АК

Александр Караев... in pro.cxx
Вопрос по boost::beast (и asio).
Возьмём пример асинхронного http сервера из документации. Является ли вызов async_write потокобезопасным? Например, в on_read я не сразу вызываю async_write, а создаю отдельный поток, который ждёт 3 секунды и после вызывает async_write. Нужно ли что-то блокировать для этого? Или проверять валидность каких-нибудь объектов?
Судя по доке - всё должно быть ок, так как никаких других асинхронных операций на данной сессии у меня после on_read быть не может (повторное чтение я не запускал, запись также ещё не началась), а значит и async_write можно звать без синхронизации.

Все объекты в shared_ptr + enable_shared_from_this, так что ссылки не протухнут
источник

MM

Mikhail Matrosov in pro.cxx
Andrey Davydov
Не прав. И он еще не реализует эту логику http://eel.is/c++draft/basic.link#18, но она появилась в стандарте совсем недавно, видимо после пражского заседания в феврале, еще полгода назад не было понятия TU-local.
попробовал в visual studio. она вообще ВСЕМ объектам дала разный адрес 😬 плюс почему-то не напечатала строковую константу 🤔 странно. не хочу разбираться, что с ней не так.
18 00007FF729943360
18 00007FF729943358
00007FF729945700
18 00007FF72994335C
00007FF729945720
источник

AM

Aleksey Muravev in pro.cxx
Mikhail Matrosov
попробовал в visual studio. она вообще ВСЕМ объектам дала разный адрес 😬 плюс почему-то не напечатала строковую константу 🤔 странно. не хочу разбираться, что с ней не так.
18 00007FF729943360
18 00007FF729943358
00007FF729945700
18 00007FF72994335C
00007FF729945720
Там есть флаг, что это отключает
источник

MM

Mikhail Matrosov in pro.cxx
Aleksey Muravev
Там есть флаг, что это отключает
можно флаг в студию? (простите за каламбур)
источник

AM

Aleksey Muravev in pro.cxx
Mikhail Matrosov
можно флаг в студию? (простите за каламбур)
Dynamicbase или highentropy. Я точно не помню
источник

MM

Mikhail Matrosov in pro.cxx
Aleksey Muravev
Dynamicbase или highentropy. Я точно не помню
погуглил - не смог ничего такого найти
источник

AM

Aleksey Muravev in pro.cxx
Mikhail Matrosov
погуглил - не смог ничего такого найти
источник

MM

Mikhail Matrosov in pro.cxx
Aleksey Muravev
Dynamicbase или highentropy. Я точно не помню
🙈
источник