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

Контракт - я подразумеваю код (контракт может быть матрёшкой) - кирпичик архитектуры. Ну почему, если вам интересно пройдитесь по вложеным цикламх3 …

Можно бесконечно разглагольствовать о возможностях какого-либо языка программирования. Только вот распространённость этого языка на деле определяется не только возможностями самого языка, но и удобством и полнотой средств отладки. Грохнулась программа на сервере и потребуется как можно быстрее найти причину. «Кресты» тут явно уступают Джаве с Си-Шарпом - вот почему промышленная разработка больших программ ведётся на чём угодно, но не на «Крестах». Чем проще программисту разобраться в причине возникновения ошибки и устранить её, тем распространённее будет язык программирования в отрасли разработки ПО.

Где требуется отрабатывать быстро, применяют аппаратные ускорители и «чистый» Си, например, в роутерах. Где много кода и сложное ПО, то используют Джаву и Си-Шарп. Вместо админского Баша придумали Гоу. На серверах сегодня «Кресты» массово просто не нужны. Не мучайте себя и переходите на промышленные языки программирования, где зарабатывают денежки, а не маются ерундой.

Enthusiast ★★★★
()
Ответ на: комментарий от Enthusiast
iterations : 4096 
for str_for(i=0;i<size): Среднее время: 42.4685 ns
for range_for_vector(auto& a:): Среднее время: 47.458 ns
for recursion: Среднее время: 69.1807 ns

ну в целом да, но наверно

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

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

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

еще ОС кстати, потомучто ОС можно выбрать, а можно иметь базу знаний по ОС, которая написана как бы и изучена.

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

потом если перенести вопрос в другую немного плоскость, но остаться в ява/с++, на яве можно написать воксельный движок, а можно написать на Расте, но есть на С++ бэдрок, те данные с которыми работает воксельный движок, абстрактны, и тот нюанс прохода и смещение в обработку данных циклы против рекурсий, а в воксельке грид против дерева, даже сегодня бьёт точно в цель. Да можно писать сайты, микросервисы, Go/Python/что-то еще, но нюансы обходов никуда не деваются, кривая Мортона осталась по кривой Гильберта, или аппаратный проход по последовательности, просто это еще одна возможность сделать одно и тоже.

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

еще почему я с вами согласен, иногда очень хочется какой-то свой инструмент, а сразу не понимаешь как оно, так я написал свой текстовый редактор на яве, а С/С++ это попытка/и, иногда можно потестить на Расте - если не течет ваще крутяк, но есть маленький нюанс, на яве если текстовый редактор успевает и лок потока логичен с пользовательской стороны когда открываем файл с 1-4миллионом строк, то например если если написать свой терминал на яве то mc - как пример нюанса, просто технически не успевает буквально на там крохи скорости ему нужны…. )

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

иногда очень хочется какой-то свой инструмент, а сразу не понимаешь как оно, так я написал свой текстовый редактор на яве, а С/С++ это попытка/и, иногда можно потестить на Расте - если не течет ваще крутяк, но есть маленький нюанс, на яве если текстовый редактор успевает и лок потока логичен с пользовательской стороны когда открываем файл с 1-4миллионом строк, то например если если написать свой терминал на яве то mc - как пример нюанса, просто технически не успевает буквально на там крохи скорости ему нужны

Ты изучаешь все подряд, пытаясь выбрать лучшее орудие труда программиста? В этом случае лучше довериться совету признанного мастера программонаписательского дела, чтобы не истратить время и силы впустую и изначально выбрать верное направление развития. На вопрос о том какие пять языков программирования стоит изучить исчерпывающе ответил выдающийся изобретатель-программист нашего времени Джордж Хотц в беседе с Алексеем Фридманом. Краткий ответ: «Крестов» там нет!

Ссылка ведет на «Ютуб». Извините меня, ребята, если кто-либо не сможет посмотреть этот пятиминутный видеоролик - на «Рутубе» лежит одна развлекаловка и технические обсуждения мирового уровня там сложно найти.

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

Принимается, но частично. На размере меньше 5, где чанки не помогают, все равно быстрее. Переписал на структурную побайтовую: https://godbolt.org/z/Kd5aMTsG7.

unsafe fn cstr_hash(s: &[u8]) -> u32 {
    let (mut a, mut pos, mut v) = (ACCUM_INIT, 0, 0);
    let mut b; 
    loop {
        for i in 0..4 {
            b = unsafe{ *s.get_unchecked(pos) }; pos += 1;
            if b == 0 {
                a = accum_feed(a, v);
                return accum_finalize(a) as u32          
            }
            v |= (b as u32) << 8*i;
        }
        if unsafe{ *s.get_unchecked(pos)}==0 { continue }
        a = accum_feed(a, v);
        v = 0;
    }
}

и сишная такая же, и без копипасты ). Обе быстрее гоутошной процентов на 20, на кол-ве байтов <5, и чуть медленнее (единицы процентов) - на длинных.

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