170 похожих чатов

Поэтому мой всем совет. Встречаете убийцу C++: подходите и задаёте

ТРИ ГЛАВНЫХ вопроса

(1) typeid
(2) ошибки в конструкторах
(3) делегация сестринскому типу

Всё. Дальше всё ясно сразу. Люди выкручиваются, ссылаются на бедный LLVM, предлагают аборт, людей корёжит. Почему? Потому что это настоящие проблемы. И настоящие недостатки C++. И красивого решения я тут не видел нигде ни разу. Либо отказ от самой концепции (что сразу проигрыш) либо аборт.

60 ответов

65 просмотров

А что такое (3)?

Konstantin-Vladimirov Автор вопроса

Я выше ответил: при виртуальном наследовании dynamic cast к сестринскому типу и вызов там метода. Очень интересная проблема. Очень криво решена в C++. Никак (вообще НИКАК) не решена нигде кроме C++.

Konstantin Vladimirov
Я выше ответил: при виртуальном наследовании dynam...

Понятно. А вам доводилось встречаться в своей практике с виртуальным наследованием?

Konstantin-Vladimirov Автор вопроса
Alexey Egorov
Понятно. А вам доводилось встречаться в своей прак...

Да конечно. Вам тоже. Вы хотя бы раз писали cout << "Hello world"? Вот. Это оно =)

Konstantin Vladimirov
Да конечно. Вам тоже. Вы хотя бы раз писали cout <...

Вот сейчас не понял. Каким образом это оно?

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

Konstantin-Vladimirov Автор вопроса
Alexey Egorov
Вот сейчас не понял. Каким образом это оно?

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

Konstantin-Vladimirov Автор вопроса
Alexander B. Babayants
Ну это академический взгляд на вещи. А для индустр...

Это ошибка. Для индустрии важна фильтрация дураков на ранних подступах. Но с этим и C справляется.

Konstantin Vladimirov
Там ромбовидное наследование. Виртуальное наследов...

А где оно? Если честно, я всё ещё не понимаю, хотя иерархию наследования вроде бы представил.

Sergey Kaniskin
в std::ostream

адский дизайн из 90х, хорошо, что сегодня так не делают

Konstantin-Vladimirov Автор вопроса

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

Konstantin-Vladimirov Автор вопроса
Evgeny Sh.
«Ошибки в конструкторах» это какая-то дичь, не дол...

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

Konstantin Vladimirov
Да конечно. Вам тоже. Вы хотя бы раз писали cout <...

Ага худший способ вывода, который сделан настолько убого что потребовал имплементации с виртуальным наследованием, по вашем формат и его аналоги на ровном месте появились? В общем довольно слабая аргументация

Pavel Perekhozhikh
Там точно оно есть?

Да https://github.com/llvm/llvm-project/blob/main/libcxx/include/istream#L180

Arelav
Да https://github.com/llvm/llvm-project/blob/main/...

Ты на стандарт укажи а не имплиментацию

Arelav
Эм речь про имплементацию

Эм, выйдет новый llvm и не будет

Pavel Perekhozhikh
Эм, выйдет новый llvm и не будет

Угу за 30 лет не вышел что то

Pavel Perekhozhikh
Кого? Ллвм?

У всех реализаций

Konstantin-Vladimirov Автор вопроса
Arelav
Ага худший способ вывода, который сделан настолько...

iostream отличный способ вывода так как позволяет легко переопределить вывод для пользовательских классов. Он несравнимо лучше printf и любых аналогов в любых других языках. Просто небо и земля. Если вы этого не понимаете, то в общем разговаривать не о чем. boost::format появился на базе iostream как забавные вариации на тему. Широкого распространения не получил.

Konstantin Vladimirov
iostream отличный способ вывода так как позволяет ...

fmt format с некоторыми изменениями принят в стандарт

Konstantin Vladimirov
iostream отличный способ вывода так как позволяет ...

Тут стоило бы задуматься, iostream – это способ вывода или способ форматирования? И уже в этом вопросе видно невооружённым взглядом проблему. Он бросается решать больше, чем одну проблему и решает их все одинаково. Одинаково плохо

Arelav
fmt format с некоторыми изменениями принят в станд...

В absl есть Substitute, в folly Format, в бусте реализация довольно плохая. По поводу юзер типов не вижу проблемы https://fmt.dev/latest/api.html#formatting-user-defined-types

Ofee Oficsu
Тут стоило бы задуматься, iostream – это способ вы...

я кстати не вижу ничего плохого в printf, более того, многие компиляторы умеют его статически проверять

usernameak
я кстати не вижу ничего плохого в printf, более то...

Разнаная размерность типов на платформах

Pavel Perekhozhikh
Разнаная размерность типов на платформах

а где это конкретно создаёт проблему?

Konstantin-Vladimirov Автор вопроса
Ofee Oficsu
Тут стоило бы задуматься, iostream – это способ вы...

За вас задумались. Там сверхгениальное разделение на буфер отвечающий за вывод и поток отвечающий за форматирование.

usernameak
я кстати не вижу ничего плохого в printf, более то...

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

Konstantin Vladimirov
За вас задумались. Там сверхгениальное разделение ...

Угу иначе как сверхгениальным и не назовешь

Arelav
Принтф довольно неплох, но довольно неудобно указы...

жаль что в плюсах нет такого принтф как в D

usernameak
а где это конкретно создаёт проблему?

Ты берёшь либу где писали под 32 и компилишь как 64, или наоборот

usernameak
не юзай %ld и не страдай

:) я бы тебя расцеловал, еслиб ты работал с легаси

Pavel Perekhozhikh
Лонги тут при чем?

а какой ещё тип имеет такую проблему?

usernameak
не юзай %ld и не страдай

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

int_fast_32_t x = 5; printf("???", x);

где ты в легаси такие типы видел?

usernameak
а какой ещё тип имеет такую проблему?

На android чар, вот прям разное поведение при переполнении

Pavel Perekhozhikh
На android чар, вот прям разное поведение при пере...

на андроиде чар ансайнед это скорее баг стандарта, который такое позволяет, чем проблема реализации

Dima
Что за легаси ?

любой старый как труха код

Alexey Egorov
Понятно. А вам доводилось встречаться в своей прак...

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

Arelav
Угу иначе как сверхгениальным и не назовешь

ну если рассматривать iostream как вещь, где скорость неособо важна, а удобство нужно - он действительно хорош. И добавлять пользовательские типы даже легче чем с std::format(там явно что-то не доглядели в этом плане) Но скорость у стримов страдает и они правда пытаются решить слишком много проблем. И напрягает что добавляют новые стримы(spanstream например) вместо того чтобы как-то переделать концепцию, чтобы убрать виртуальные функции и наследование (повысить производительность)

Kelbon
ну если рассматривать iostream как вещь, где скоро...

Ну и проблема перфа стримов концептуальная Смотри по своей сути format это конкатенация н строк А stream это аппенд н строк Второе by design делает log n аллокация вместо 1

Kelbon
ну если рассматривать iostream как вещь, где скоро...

По поводу того что user defined для стримов удобнее чем для формата я в целом согласен, но я предпочитаю ToString метод

Kelbon
там буфер так что это даже лучше

Мне кажется не корректно сравнивать format и cout, логичнее со stringstream. Или cout с print Ну и в случае format или stringstream речь как раз о кейсе который я описал

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта