LINUX.ORG.RU

C++ — туда и обратно, или зачем нужен Boost

 , , ,


3

4

Мой предыдущий тред в Development собрал самое большое число ответов аж с сентября, то есть за последние 9 месяцев, и это лишний раз подтверждает упадок этого форума. Полагаю, кто-то должен это изменить, и поэтому мы с тобой, ЛОР, поговорим сегодня про C++.

Начиная с C++26 вместо std::function вводится пачка новых классов: std::copyable_function, std::move_only_function (доступна с C++23) и std::function_ref. Что же не так с оригинальным std::function, ты можешь спросить? А вот что:

#include <functional>
#include <print>

struct call_me {
    int x = 0;
    void operator()() {
        std::print("x was {}\n", x++);
    }
};

int main() {
    const std::function<void()> f = call_me{};
    f();
}

Несмотря на то, что переменная f объявлена константной (люблю оксюмороны!), у неё есть внутреннее состояние и оно меняется при вызовах. Компилятор это без проблем хавает.

Так вот, ковыряясь в том, зачем и кто вообще смог так насрать себе в штаны сам, я наткнулся на статью ребят, которые подводят список подобных косяков комитета C++, когда фичи живут по 10 лет и объявляются устаревшими.

Небольшой список фич, которые были придуманы, оказались не нужны/бесполезны/вредны и выкинуты:

  • Известный vector<bool>, живущий издревле в STL и про который все говорят, что его надо избегать. Частично заменяется std::bitset.
  • std::auto_ptr. Бесполезен, ломает контейнеры, выкинут на помойку в C++17.
  • Указание исключений у функции в формате throw(X, Y). Так же выкинуто в C++17.
  • std::iterator объявили устаревшим в C++17, собираются удалить в C++26.
  • std::aligned_storage и std::aligned_union добавлены в C++11, объявлены устаревшими в C++23, скоро удалят.
  • Ключевое слово register удалено в C++17, хотя всё ещё доступно в Си.
  • std::get_temporary_buffer и std::raw_storage_iterator удалены в C++20.
  • Потрясающее по эпичности фиаско с интерфейсом для сборщиков мусора. std::declare_reachable сотоварищи были добавлены в C++11. Выяснилось, что сборщики мусора для C++ писать либо никто не умеет, либо никто не хочет, поэтому в C++23 это всё удалили и сделали вид, что ничего не было.
  • Абсолютное безумие вокруг концептов, модулей и поддержки сети. Предложения одобряли, вновь отклоняли, переделывали, и по итогу теми же модулями до сих пор никто не пользуется.
  • Сопрограммы (coroutines). В том виде, в котором они есть в C++, это просто ужас. Достаточно того, что корутины требуют выделения памяти из кучи во время работы, а значит вообще не подходят для случаях, когда требуется серьёзная производительность. Например, в любом коде, требующим работы в реальном времени и не позволяющем делать системные вызовы.

Просто лютый трешак, который никто подчищать пока не собирается:

  • std::regex – лютый тормоз, рекомендуется не использовать.
  • Мертворождённый std::simd, добавленный в C++26 и уже с ходу не нужный вообще никому, потому что код с std::simd в два-три раза тормознее чем со сторонними библиотеками, просто голыми интринсиками, и даже медленнее чем просто цикл for.
  • std::async. Дескруктор ждёт завершения асинка и поэтому может залочить весь код тебе. Наконец починили в C++26, но эта штука была сломана 15 лет.
  • Отвратительно спроектированный <iostream>. Его наконец можно выкинуть и использовать std::print, но не все про это знают.
  • Абсолютно тормозные контейнеры map, set, unordered_map. Вместо первого можно использовать flat_map из C++23. Контейнеры в стандартной библиотеке Rust (BTreeMap) и другие реализации B-Tree Map их обгоняют по производительности, но тем не менее в C++ выбирают убогий дефолт.

Решения многих из этих проблем существуют в Boost и сделаны там гораздо лучше. Но в то же время возникает важный вопрос: зачем вообще нужен настолько плохо спроектированный язык, где каждое следующее поколение инженеров, работающих над ним, отменяет решения предыдущих, а код под новые стандарты часто нужно переписывать если не с нуля, то очень близко к тому? Даже процесс разработки Rust с его поехавшими клоунами в юбках на этом фоне выглядит адекватным.

В общем, всё печально, ЛОР. Такие дела.



Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от anonymous

я наверно тут ошибся или нет, вроде msse4.2 почти везде есть, поэтому получается можно накатить смело сразу всю математику 1 раз руками.

anonymous
()
Ответ на: комментарий от anonymous

у меня С++ интринсики обогнали раст,

без валгринда

С++ 77 ns, в Раст 21.879µs - тут компиляторы делают оптимизацию срезают код,

с валгриндом

С++ 167288 ns, в Раст 168.027µs поидее это одинаковые размерности, если так то на валгринде код практически идентичный

anonymous
()

в С++ походу код генерируемый компилятором как и в Раст на автомате от агрессивной компиляции, оба компилятора на базе LLVM, я подозреваю что интринсики не на С, а проект на С++, там одинаковая будет оптимизация что с интринсиками что без, но я это не проверял, тоесть если делать проект на С и там разобраться как его компилять, математику в отдельном инклуде типо, там я чувствовал ускорение прям в игре, а в С++ на тестах фигня какая-то… но это скорее всего я не знаю.

anonymous
()
Ответ на: комментарий от shdown

смотрите отправная точка, предположим у нас под любую строку любого вида выделяется память кратно 16, чтобы не искать остатки, мы управляет ‘\0’ и если строки разные фиксируем по нему, тогда получается все участки кратные 16, уложаться в какой-то алгоритм паралельного доступа строки.

тоесть

строка1[64] -> *строка1[0] -> *строка1[16] -> *строка[32] -> *строка[48]-конечныйблок, получается имея эти карманы, смотря как мы фиксируем конец тоесть последние 16 значений мы их можем обработать паралельно типо по кодпойнтам или как-то еще наверно.

например если там умножение, я просто не знаю в хеше последующий елемент ждёт предыдущий.

даже если я ошибся по хеш подходам такой подход помогает, вообще потестить алгоритм свёрток хотябы на простом for, и у вас goto не знаю на сколько это еффективно, я вчера смотрел тоже 1 библиотеку там я тоже увидел goto, и сразу понял чтобы goto это как бы трюк да, но лучше обработать это языком штатно наверно.

anonymous
()
Ответ на: комментарий от BruteForce

Вот я в этом сомневаюсь. Он же умеет читать то, что по ссылкам (см. комментарий выше) и даже постить код на godbolt.

shdown ★★
()
Ответ на: комментарий от anonymous

предположим у нас под любую строку любого вида выделяется память кратно 16

Если вы про alignment, то для хэш-функции общего назначения, которая просто «скопируй и используй», низя полагаться на alignment.

Если про размер, то пофиг вообще на кратность степени двойки — сначала обрабатываем тело, потом хвост.

последние 16 значений мы их можем обработать паралельно типо по кодпойнтам или как-то еще наверно.

например если там умножение, я просто не знаю в хеше последующий елемент ждёт предыдущий.

Это зависит от хэша. CRC-32 можно распараллелить, FNV-2 и моё нельзя.

Вот пример хэш-функции, специально заточенной под instruction-level parallelism: https://docs.rs/seahash/latest/seahash/ (cast BruteForce — утверждается, что быстрее xxHash).

и у вас goto не знаю на сколько это еффективно,

Если бы не было эффективно, его бы у меня не было. Попробуйте переписать на конструкциях structured programming

    for (;;) {
        // ...
        if (cond1) goto brk1;
        if (cond2) goto brk2;
        if (cond3) goto brk3;
        if (cond4) goto brk4;
        // ...
    }

brk1:
    // ...
brk2:
    // ...
brk3:
    // ...
brk4:
    // ...

shdown ★★
()
Ответ на: комментарий от shdown

я планомерно подвожу к аппаратной строке, на интринсиках.(где можно закинуть выровненую память и все операции со строкой делать по маскам кратно 16)

про goto, сразу приведу https://habr.com/ru/articles/550926/ посмотрите на всякий случай, теперь в чем прикол.

то что вы привели надо переосмыслить и перевести на вызовы функций или подумать как сделать хорошо в условиях прохода case наверно

void func1(from , to){

}
showcase(data){
 
 switch(){
   case :{
      func1(data,temp);
   }
   //break/!break;
   default:{
     break;
   }
 }
 
}

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

anonymous
()
Ответ на: комментарий от anonymous

если писать с нуля строку накладно, можно тогда сделать интереснее тоже, можно инкапсулироваться от строки, но добавить 2-10 спец-обработчика, который принимает эти штуки хитрые и делает по 16

anonymous
()
Ответ на: комментарий от anonymous

в чем проблема со строкой, в компромиссе кодпойнтов, пока мы в условиях аски всё окей, как только начинается хитрая матеша по кодпойнтам для определения символа, тут придётся долго всё пробовать и сравнивать, потомучто мультибайтовая строка по дефолту дорогая, или переменная строка, где постоянно чото считать придётся как я понимаю, типо в строке типа такого-то 1 мы пакуем/распакуем букоуку. кароче с вопросом на вырост, я забил, но то, что можно на sse4.2 на прямую, что-то переписать походу смысл в этом есть я думаю.

anonymous
()
Ответ на: комментарий от anonymous

как помогает виртуальная стековая машина и виртуальный процессор на 8 команд, процессор помогает понять или вспомнить дос, стековая покажет падение производительности, возвращаясь к обсуждению, почему какой-то код медленнее, кода от разработчиков на спец вызовах, потомучто накладные расходы на доступ к быстрому расширению, оптимизирован типо, если проводить аналогию со стековой машиной, это как пытаться её вызовы обернуть в шитый код и диспетчизацию… если её писать на анси С это просто адище

anonymous
()
Ответ на: комментарий от r--r--r--

вы недооцениваете проверку гипотез в рамках достижения желаемого результата, тут стоит вопрос не как, а стоит вопрос я хочу понять это и это, как настроить окружение, а может мне это окружение не понравится, потомучто я хочу поддержку этого-этого этого, и тогда вопрос стоит, понять базу, и сделать как я хотел, это ли не момент ‘понять’ нужен мне блокнот или vscode, тоесть вы сразу поняли ‘так’?… …вот так я не хочу вообще, скипаем и делаем сразу вот так, чтоб Zed летал например.

anonymous
()
Ответ на: комментарий от anonymous

ну кстати можно уйти в философию, вот есть рост ИИ, рост инструментов и прочее, получается, а есть такой редактор, который откроет все настройки ИИ, или если помечтать, завтра произойдёт рост технологий, и тогда то что сейчас с трилионами папок и файлов, это получается я в будущем захожу на жесткий диск, у которого мега много памяти, а кода стало больше, получается больше папок и больше файлов…, больше расход памяти, больше потребления типо, больше потребления на то, чтобы запустить простейшее окружение например, ну тоесть банальная масштабируемость…

anonymous
()
Ответ на: комментарий от anonymous

Да, zed (в zsh можно сделать autoload -Uz zed и редактировать файлы через встроенный в шелл редактор через zed hello_world.c) — прикольная штука, конечно, но оно, например, не может в автоформатирование, редактирование нескольких файлов одновременно и т.д.

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от r--r--r--

Какой-то артефакт инопланетной культуры. Ещё и название украли у z[sh] ed[itor].

shdown ★★
()
Ответ на: комментарий от zurg

Ты дурак? Если выполняется cond1, нам нужно выполнить act1() И ПОТОМ act2(). Между brk1: и brk2: нет control flow. А в случае четырёх условий (как в оригинале у меня),

    for (;;) {
        // ...
        if (cond1) { act1(); act2(); act3(); act4(); }
        if (cond2) {         act2(); act3(); act4(); }
        if (cond3) {                 act3(); act4(); }
        if (cond4) {                         act4(); }
        // ...
    }
Без дубликации кода это можно как-то сделать в structured programming?

shdown ★★
()
Ответ на: комментарий от r--r--r--

Э… я установил себе это чудо.

Оно не умеет подсвечивать синтаксис ничего, кроме пары-тройки модных языков. Java, Lua, Perl, PHP — не умеет.

Автодополнять, даже тупо по существующим словам в файле — не умеет (ни tab, ни ctrl+space, как заявлено в документации, не работают — tab вставляет табуляцию, по ctrl+space ничего не происходит, в консоли ошибками не сыпет).

Spell checker’а из коробки нет. Попробовал установить https://zed.dev/extensions/codebook — оно ничего не делает, даже в коде на языке, который поддерживается (не находит опечаток нигде, ни в именах, ни в строках, ни в комментариях). Хотя везде подчёркивается, что это расширение — “No configuration needed”.

Короче даже до уровня вима не доросли пока, уровень zed.

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 2)
Ответ на: комментарий от shdown

в сеттингс надо добавлять ручками, что нужно

это файл откроется если открыть сеттингс-> редактировать файл json

    "light": "One Light",
    "dark": "One Dark",
  },
  "lsp": {
    "zls": {
      "binary": {
        "path": "/path/to/zls-0.16.0/zig-out/bin/zls",
      },
      "settings": {
        "enable_build_on_save": true,
      },
    },
    "clangd": {
      "binary": {
        "path": "/usr/bin/clangd-20",
        "arguments": ["--header-insertion=never", "--fallback-style=google"],
      },
    },
  },
anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

То есть ему для работы с C/C++ нужен clangd? А почему он об этом не информирует, зато информирует о том, что у меня видеокарта расово неполноценная. Игры, хоть и не современные, летают, браузер, значит, летает, а этому чего?

Я попробую установить clangd, но, насколько я понимаю, автодополнение редактирования (оно в Zed-editor с ограничениями, ограничения снимаются за плату) не будет работать из РФ (ведь человек из РФ не сможет платить, когда подсядет на это автодополнение), а для каждого языка нужно будет поднимать отдельную ерундовину, подобную clangd.

Я угадал?

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 2)
Ответ на: комментарий от shdown

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

anonymous
()
Ответ на: комментарий от shdown

для того чтобы понять какое автодополнение это надо понять о чем вы, автодополнение кода? тогда я не знаю как работает clangd надо читать доку клангд, clangd-20 –help наверно

anonymous
()
Ответ на: комментарий от shdown

на расте можно кодить без зависимостей, как на С++, тогда если вы задались этим вопросом сейчас начните это изучать наверно

anonymous
()
Ответ на: комментарий от anonymous

заморозьте версию раст, в консервированной версии например кодьте только с нуля, придётся писать этот код, разбираться как поднимать нужный функционал от аби С наверно

anonymous
()
Ответ на: комментарий от anonymous

в консервированной версии есть clippy например поидее он работает локально.

anonymous
()
Ответ на: комментарий от shdown

for (;;) {

    // ...

    if (cond1) { act1(); act2(); act3(); act4(); }

    if (cond2) {         act2(); act3(); act4(); }

    if (cond3) {                 act3(); act4(); }

    if (cond4) {                         act4(); }

    // ...

}

Без дубликации кода это можно как-то сделать в structured programming?

В приницпе - да. Через ещё одну переменную:

    for (;;)
    {
        // ...
        bool run = false;

        if (cond1)
        {
            run = true;
            act1();
        }
        if (run || cond2)
        {
            run = true;
            act2();
        }
        if (run || cond3)
        {
            run = true;
            act3();
        }
        if (run || cond4)
        {
            act4();
        }
        // ...
    }

Это, разумеется, не значит, что goto это плохо.

r--r--r--
()
Ответ на: комментарий от shdown

Это норм, ChatGPT в «агентном режиме» открывает вкладочки, кликает и всё такое.

BruteForce ★★★★
()
Ответ на: комментарий от r--r--r--

Нет-нет, там (в Zed-editor) edit predictions — платные:

$0: 2,000 accepted edit predictions

$10 per month: Unlimited edit predictions, $5 of tokens included, Usage-based billing beyond $5

$30 per seat, per month: [blah-blah-blah]

Дело в том, что такие free-to-play, так сказать, сервисы никогда не работают в РФ, потому что их смысл — в том, чтобы подсадить человека на свой продукт, чтобы он потом платил. А человек из РФ не сможет этого сделать.

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 3)
Ответ на: комментарий от shdown

Нет-нет, там (в Zed-editor) edit predictions — платные:

Я чё-т щас не понял. Это ты, ни разу в жизни не видивший этой херни, рассказываешь мне, видевшему эту херню, что я могу и чего не могу?

Ты себя хорошо чувствуешь? Воды достаточно потребляешь?

их смысл — в том, чтобы подсадить человека на свой продукт,

Они ии-агента продают или ещё что-то. Но мне как-то пофик, я из исходников собрал.

r--r--r--
()
Ответ на: комментарий от r--r--r--

Я чё-т щас не понял. Это ты, ни разу в жизни не видивший этой херни, рассказываешь мне, видевшему эту херню, что я могу и чего не могу?

Во-первых, у тебя по ссылке показано не автодополнение изменений (edit prediction), а обычное автодополнение. Ты невнимательно прочитал, что я пишу.

Во-вторых, они продают инфраструктуру для inference для их модели Zeta2, которая нужна для edit prediction. Какое железо нужно для того, чтобы поднять эту Zeta2 локально — не знаю, но, судя по тому, что они продают инфраструктуру для этого, это обойдётся дорого.

У тебя эта Zeta2 локально работает?

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

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от shdown

Ты невнимательно прочитал, что я пишу.

Нетты.

а автодополнение изменений-то будет из РФ работать?

Всё, что локально работает через LSP, будет работать локально в любой точке времени и пространства.

Во-первых, у тебя по ссылке показано не автодополнение изменений (edit prediction), а обычное автодополнение.

Да, шлангом через LSP. Это работает.

Что там с ИИ я не знаю. Создай на форуме новую тему с этим вопросом, если тебе интересно.

P.S.

P.S. Я не понимаю, как можно неиронично пользоваться подобным поделием.

Просто проаудируй весь исходный код редактора.

(На самом деле мне было лень настраивать LSP для раста в vim.)

r--r--r--
()
Ответ на: комментарий от r--r--r--

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

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

это звучит так будто на гитхаб надо заливать код обязательно командой, это еффективность ), кому какое дело набираю я текст в редакторе и мучаюсь от дерганья этого текста, или пользуюсь плавным интерфейсом, или код заливаю файлом а не командой )

anonymous
()
Ответ на: комментарий от r--r--r--

Нетты.

То есть мы можем прийти к следующему:

#1. Я задал вопрос про автодополнение изменений (edit prediction).

#2. Ты оставил ответ про какую-то функциональность, которая не относится к edit prediction.

#3. Я указал на то, что бесплатных edit predictions там всё-таки можно сделать только ограниченное количество в месяц.

#4. Ты сказал, что мне нехорошо, и что у тебя всё работает, показав скриншот функциональности, которая не относится к edit prediction.

Зачем ты оставил ответ (#2)? Почему ты решил опровергнуть мои слова про платные edit prediction скриншотом обычного автодополнения (#4), а не edit prediction?

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от shdown

Зачем ты оставил ответ (#2)?

Затем, что ответ #2 является ответом вот на эти тезисы:

Оно не умеет подсвечивать синтаксис ничего …
Автодополнять, даже тупо по существующим словам в файле — не умеет …
даже в коде на языке, который поддерживается (не находит опечаток нигде, ни в именах, ни в строках …

Найдёшь их автора?

Почему ты решил опровергнуть мои слова про платные edit prediction скриншотом обычного автодополнения

Потому что я опровергаю "Нет-нет, …" к предыдущему посту.

r--r--r--
()
Ответ на: комментарий от shdown

я когда писал свой текстовый редактор на Java25 столкнулся с тем же вопросом, типо есть стандарт лсп, и можно легко выбором в пользу «давай напишем по своему» превратим редактор текста в непонятно что типо, то что есть лсп это нормально же, это языковый протокол для подсветки от самого компилятора помойму, как вы собираетесь определять текст когда это может сделать компилятор 1 прогоном, отключая выход на бинарник, давая точные данные на разметку где подсветить подчеркнуть, сейчас к бекенду LLVM может написать свой прогон только тот кто знает как происходит его проход от компилятора, ровно как и особенности глубокие касаемые компилятора или реализаций по типу шадоу-стека для отладки. Просто пользователь-разраб, которому нравится язык не сможет внести обьективный вклад в компилятор, он видит только фасад, а саму архитектуру компилятора видит только тот кто его пишет.

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

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

anonymous
()
Ответ на: комментарий от anonymous

мне например нравится другая реализация Emacs, но пользоваться им тоже не удобно, а самим емакс не удобно например, потомучто вечно отвлекаешься на эти скрипты или хотелки или тесты, чото дергается не дергается, поведение текстовое буквально, нужен просто интерфейс как блокнот, но с лсп, и плавностью и мышка как управление, а в эти всякие вим, типо щас «смори я вбил код ща оно сделаецо и тут еще горячих кнопок нажму» - это тоже не всегда удобно для меня лично.

anonymous
()
Ответ на: комментарий от anonymous

а вот еще пример кстати, вот например надо сделать текст, вы как будете делать? пойдёте в скрипты? или скрипты + векторный редактор, или честно его нарисуете в растер редакторе превратив в сетку, с последующей ручной доводкой до файлика без скриптов без векторки? на векторку и скрипты времени уйдёт ого-го, а так сделал и всё

anonymous
()
Ответ на: комментарий от anonymous

вот например фонт-форж, там есть пуск луча, который не понятно как настроить проще рукой отрисовать повторно по растру превратив это в файлик, а скрипты да, так посмотришь «кликай-сюда-настраивай-подбирай кучность-повторяй пока не получится» звучит завораживающе, но после второй попытки на одном глифе понимаешь, что проще отрисовать рукой.

anonymous
()
Ответ на: комментарий от anonymous

Как написать бинарный поиск на китайском?

shdown ★★
()
Ответ на: комментарий от r--r--r--

Оно не умеет подсвечивать синтаксис ничего …

Мы выяснили, что для этого нужны плагины.

Автодополнять, даже тупо по существующим словам в файле — не умеет …

У меня не автодополняет.

даже в коде на языке, который поддерживается (не находит опечаток нигде, ни в именах, ни в строках …

Ну да, у меня расширение спеллчекера не работает, даже в исходнике на Rust. Хотя заявлено, что “no configuration needed”. Для спеллчекера тоже нужен LSP или нейросеть?

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.