Обновить
8K+
64
Андрей@MegaHard

программист

3
Рейтинг
48
Подписчики
Отправить сообщение

Угу, а то так пару кнопок нажать, и потом сборки на сервере CI/CD лягут.

худшее в жизни системного программиста — это когда не‐системщики думают, что осознают всю глубину трагедий, из которых она состоит

В линуксе же как-то обобщили. Как думаете, сколько занимает bool в подобных библиотеках? Они уже по факту используются, только надо привести их к более употребимому виду. Например, убрать com-порт из Qt в отдельную либу, потому что его наличие в графической либе - это нонсенс.

Застал немного время до C++11, в нём потоки, лямбды и прочее удобство добавилось, поэтому чувствовалось, что язык идёт в правильную сторону.

А где тут вообще (N)RVO кейс мог бы быть?

Ни где, и вроде даже не утверждается ни где, что он мог бы быть. Речь о том, чтобы компилятор, если он видит, что один из объектов дальше использоваться не будет, не создавал копию, а использовал оригинал, не думая о том, что возможно, программист действительно хотел получить вызов копирующего конструктора. Пойдите и посчитайте, сколько раз в проекте вызывается std::move, в удобном языке должно быть в районе 0.

Зачем какието теги для (N)RVO если это оптимизация на усмотрение компилятора (на чиная с 17 даже строже)? Зачем её явно запрещать или разрешать? Конструкторы и RVO это перпендикулярные вещи.

Вот вы мне и ответьте, зачем какие-то теги, и почему в этой статье народу идея с тегами зашла.

Представьте, что вам не язык как произведение архитектуры надо разглядывать, а продакшен выдавать. И потом посмотрите на статистику использования языков.

Как Вы это в стандарт описывать собираетесь? И зачем так делать?

Ни разу не пробовал, так что не знаю. А делать так для оптимизации кода. Возможно, стандарт должен разрешить дополнительно оптимизировать код для объектов без тега. Примерно как с volatile, если переменная помечена таким тегом, тогда все чтения и записи делаем скурпулёзно, а если нет, то оптимизируем.

Так дело в том, что мне вообще нет дело до dll-ек. Я подключаю библиотеку в CMake, а дальше уже само находит и подключает. До уровня .dll опускаться смысла нет.

После чего пользователи начинают жаловаться, что у них dll не хватает. Или, допустим, запускаешь свою прогу, а она подхватывает dll от notepad++ и делает что-то не то.

Вы так и не ответили на то, а зачем нужно такое с C апи?

Уже где-то писал, чтобы другие языки тоже могли использовать эти библиотеки. А если речь про конкретно библиотеку для метапрограммирования, то понятно, что ей C апи не нужен.

Описание не читаем, но уже говорим что рефлексию добавляют костыльным способом.

Технический уровень очень низкий, такое публиковать - позор для специалиста.

Странно, если все такие умные, то почему SFINAE устарел, пользовались бы дальше. Или великость помешала сразу нормально сделать и надо было перед другими похвастаться: “Мам, сматли как я на блейнфаке шаблоны велтеть умею”. А потом ошибки компиляции на несколько листов, и несколько секунд на компиляцию пустого файла, потому что компилятор в прекомпилированном заголовке шаблоны инстанцирует.

которые не вызывают конструкторов

Во-первых, вы видите разницу между “не вызывают конструкторы” и “не вызывают конструкторы лишний раз”? Во-вторых, речь об объектах на стеке. В-третьих, большие и сложные объекты на стеке обычно не хранят, а всякую мелочь можно и на месте данными заполнить.

Многое из предлагаемого уже можно делать, пусть и не самым эргономичным способом.

Хотя казалось бы, практически вся статья об эргономике. Но ладно, брейнфак так брейнфак. Скормим всё ИИ, пусть он за нас ману токены тратит.

Один из фундаментальных принципов: не оптимизируй код заранее. Все так обоптимизировались, что компилятор на пустой файл может 5 секунд тратить. У вас была ситуация, когда стандартный сериализатор не умел в потоковую запись, а у кучи людей было, что проще сделать на питоне, потому что в сях же с библиотеками возиться.

Так-то люди свои строки, векторы и аллокаторы пишут, когда сильно быстро надо, но это не общий случай.

Если надо конфиги какие-то распарсить или сайт в докере поднять, он внезапно такой простой и весит мало.

Эхе-хе, помню, в 17 стандарте вроде что-то про инициализацию переменных добавили, в 20 обратно откатили. Ещё меня как-то попросили дать ссылку на хороший код. Полез в исходники clang’а, а там такие нечитабельные трёхэтажные выражения, с целью оптимизации наверное. Да и вообще оказалось, что красивый код сложно найти. После такого вопросы, наоборот, возникают )

Угадайте, в каком языке форматирование делается так же, как в std::format. Часть пунктов направлена скорее на упрощение, чем на усложнение, чтобы не тратить ману на расстановку std::move, например.

А можно увидеть какое-то более подробное описание алгоритма? И какое отношение имеет std::string к POD типам?

Мне как-то приходилось компилятор править, так что при некотором желании можно, но сейчас наверное нет смысла. В компиляторе же есть упрощение выражений, состоящих из констант, типа (4+5)*6. Некоторая интерпретация кода вроде тоже есть. Тут конечно вопрос, как добраться до кода функций, остаётся полагаться на то, что они в заголовочном файле.
std::string хоть и не pod, но в ней какие-то инты и указатель на массив pod’ов, можно и это попробовать проинтерпретировать.

Зачем мне знать про какие-то там dll-ки? Какое отношения они вообще имеют к вопросу?

Какое отношение динамические библиотеки имеют к вопросу о стандартных библиотеках? Даже не знаю. Расслабились все, место на диске не жалеют. Скачал clang, а там пачка почти одинаковых exe’шников по 100 с лишним мегабайт весом.

Опять же, существуют CPM.cmake и nix

Что-то узкоспециализированное. nix вообще с трудом гуглится. Если речь про язык программирования, то говорить, что в C++ что-то есть, ссылаясь на другой язык, ну не знаю.

Предлагаете тогда не закидывать туда огромную кучу нормальных библиотек, а оставить только библиотеки без шаблонов?

Если что-то похожее на стандартное, ну ок, закидывайте.

Зачем вообще он нужен будет тогда

Чтобы всё доступное быстренько скачать, а с остальным уже возиться.

Тогда он явно не в стэке будет храниться.

Рво нрво выполняется автоматически компилятором.

Там вполне конкретный код приведён, и там RVO/NRVO не применяется, была по этому поводу на Хабре статья.

чем человеку скобочки не угодили

Видимо своим наличием. Зачем их писать, если можно было бы не писать без потери в скорости.

для джейсона либ хоть попой жуй

Ага, и вы это подаёте как достоинство, хотя вообще-то это недостаток, о чём в статье и говорится. Попробуйте ответить на вопрос, почему они продолжают плодиться, и почему в питоне не плодятся

Можете тогда предложить свой вариант того, как это могло бы выглядеть?

Потому и написал “может”, что это очевидно на стороне пользователя, но не компилятора. Можно предположить такое: если в выражении участвуют POD-типы, то можно посчитать результат и вписать в память. Если используются указатели на POD, то можно так же посчитать результат, выделить память и заполнить.

достаточно лишь constexpr приписать ко всему

О том и речь, чтобы не приписывать.

Boost уже стал второй стандартной библиотекой

Забиваем в поисковик “как прочитать json в python” и видим предложение использовать стандартный модуль json. Потом там же пробуем “как прочитать json в C++”, и там не видно boost. А ещё могу по второму разу спросить, как в boost называется dll, которая читает json? И да, он тяжёлый, и это проблема. В питоне хоть на маке, хоть на винде импортируешь нужную либу через pip и в продакшен. То есть вопрос не в возможности как таковой, а в пользовательском опыте. C++ просто неудобно пользоваться.

А что Вы предлагаете делать с библиотеками вроде Boost.Hana, которые целиком на шаблонах сделаны?

Предлагаю ничего не делать. Нам же не обязательно что-то сделать со всеми библиотеками в мире, достаточно добавить в SAL самые часто используемые вещи. Ну и собственно, шаблоны и шаблоны, вроде как никто не говорил, что в SAL не должно быть инклюдов. С-шники не будут плакать, если не смогут воспользоваться именно этим модулем, кому надо, тот и импортирует. Да и в принципе никто не мешает сделать отдельно папку с C-инклюдами, отдельно с C++. Вот там можно обёртки из классов написать и исключения кидать.

Так и не ясно, чем это было бы лучше подхода с constexpr сейчас

Это лучше прозрачностью написанного. Насчёт порядка выполнения блоков - тут да, надо подумать. Может обязать пользователя вручную это гарантировать, вызывая функции инициализации вручную.

Реализовывать Вы это как собрались? Предположим, что в таком блоке для “выражений” будет добавлено что-то, что закроет функцию и начнёт новую.

Это уже что-то из раздела ifdef вокруг имён функций пошло, наверное не стоит давать пользователям выходить за границы блока.

Можно было бы изучить вопрос получше, а не сразу выкидывать про это на Хабр?

Озвучил то, с чем сталкивался за 10 лет работы с плюсами, без пользовательских литералов можно обойтись, а без стандартной библиотеки не удобно. Может кто-то более шарящий и пропосал сделает.

Давайте пример кода. Отслеживать по упоминанию объекта в коде функции. goto уже не используют, код нынче не столь похож на лапшу. Найти последний блок, в котором было упоминание объекта и можно удалять.

godbolt.org говорит, что не может разобрать.

Найти бы ещё его описание. И внутри него можно пройтись по списку типов без шаблонной магии?

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

Вот и пусть делает.

Также нет гарантии, что хоть и объект дальше не используется, его можно сразу же переместить и уничтожить.

И именно поэтому предлагаю добавить тег для объектов или классов, которым это надо. Я же говорю, приведите конкретные примеры, причём желательно классов не из стандартной библиотеки. Это не так просто.

есть такие проблемы как быстрое реагирование на уязвимости

Так комитету и не надо над каждой либой сидеть. Я же потому и не в пространство имён std, а в sal их предлагаю. Достаточно обговорить формат и общие правила построения либ, а всё остальное сделать как в pip: не нравится либа - идёшь и накатываешь новую версию.

Про constexpr уже написали, но вот в этом коде может быть не совсем очевидно как сделать, а сделать это можно с помощью IILE

Ну вот, начинается брейнфак. И, главное, зачем? Разве мой вариант менее понятный или менее универсальный? Его даже в C можно использовать.

1
23 ...

Информация

В рейтинге
1 382-й
Откуда
Ростов-на-Дону, Ростовская обл., Россия
Зарегистрирован
Активность

Специализация

Разработчик приложений
C++
Git
Python
Visual Studio
Xcode
OpenGL
Qt
Cmake