LINUX.ORG.RU

Си с классами

 , ,


0

7

Тупнячка принёс, извиняйте.

Начинаю проект (личный), выбираю на чём писать: C или C++.

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

Хотелось бы какой-то сабсет C++ или суперсет над C. Чтобы библиотеки плюсовые можно было при необходимости заюзать, класс-другой написать, а то и во все тяжкие пуститься, обмазавшись строками. Но без хардкорного плюсового упорина от которого у одних глаза с первого взгляда вытекают, а другие в дурке после прочтения оказываются.

Насколько такой суперсет C / сабсет C++ ака «Си с классами» может быть кошерен?

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

Ответ на: комментарий от byko3y

Вы же не хотите сказать, что 95% учебных материалов по крестам — говно?

Бинго!

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

Трам наврняка уже где-то в ассетах есть :) Игры про него были на стиме.

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

Научись разговаривать по человечески для начала. Здесь и далее под аллокацией понимаем динамическую аллокацию.

Вектор без аллокаций я тебе в принципе показать не могу, он на то и вектор, что память под него нужно будет аллоцировать.

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

В вектор я могу запихать trait objects, про которые в твою деревянную голову долбятся уже 4 страницы. trait objects требуют аллокации.

Затирание информации о трейте происходит в момент генерации llvm ir, если конкретный тип статически известен.

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

Ну а кто тут в цари крайний? Никого? Ну так я первый буду!

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

Научись разговаривать по человечески для начала.

в твою деревянную голову долбятся

Заметь, ты первый начал про «человеческий разговор». Так что не обижайся, если я перейду на «человеческий разговор» с тобой.

Тебе напомнить историю «трейтов»?

пернатый> В русте правильный полиморфизм без аллокаций и vtable

я> Покажи

пернатый> Vec<Base>

я> Не вижу

пернатый> google://traits

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

Так как вводная к дискуссии была сплошь из противоречий, то и сама дискуссия получилась соответствующая. Но сорные растения, как ты, все равно лезут. И на любые попытки вернуться к тем трейтам, которые были в начале, так же быстро сливаются, как сорные растения, как и ты.

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

На панели состояния, где карта, патроны и вся фигня, он будет корчииь рожи, наподобие такого: 1, 2, 3. В качестве врагов сенаторы от демократов, леваки, CNN, BLM-щики и короновирус. Помежуточные боссы — Александра Оказио Кортес и Бен Аффлек, а финальный — Джо Байден (на самом деле нет. спойлеры). Надо ещё что-нибудь прикольное придумать с получением BFG у лоббистов NRA, вызова на подмогу Даны Уайта и Стивена Краудера, например. Идей полно, лишл бы хоть что-то до выборов успеть.

Идей полно, лишл бы хоть что-то до выборов успеть.

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

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

ну путена нарисуй, откуда я знаю

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

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

Но обязательно c автоматическим управлением ресурсов - RAII и готовыми классами из stl или boost, в т.ч. типизированными путями std::filesystem::path

А ничего, что бустоговно компилируется ВЕЧНОСТЬ?

По треду создаётся впечатление что понятного и читабельного кода на плюсах здесь почти никто не пишет

Понятного и читабельного кода на крестах в мире почти никто не пишет. Куда там лору. Где ж ты был 10 лет назад, когда я не знал, куда мне пойти, а от крестовых иерархий с видимостями меня воротило?

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

Шанс хайпануть был, но я раньше не допёр. Уже так не хайпану. Второго 2020, надеюсь, уже никогда не будет.

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

А ничего, что бустоговно компилируется ВЕЧНОСТЬ?

Таким страдают лишь несколько из библиотек буста. Не надо тянуть все библиотеки за уши. Тяните 5-10 из тех что актуальны в конкретной задаче, скорее всего среди них не окажется тормозов.

Например прототипы под embedded а-ля Rpi4 я прям там и собираю. Так как время на натсройку кросс-средды - не окупится.

Впрочем, возможно без буста собиралось бы ещё быстрее. Но и так нормально (нормально = 1 файл компилирутеся заметно быстрее, чем линкуется результирующая библиотека/бинарник).

Для небольшого домашнего проекта - думаю если сборка на дексктопе с нуля будет укладываться в минуту, а пересборка 1-го cpp с перелинковкой - в 5-10 секунд - будет нормально. Если вот принципиально быстрее - то да, с с++ не по пути.

Где ж ты был 10 лет назад, когда я не знал, куда мне пойти, а от крестовых иерархий с видимостями меня воротило?

10 лет назад в плюсах ещё не сложилось наиболее читабельного подмножества, описанного мною выше.

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

Адцкий Сотона, рычащий «ПРЕВЕД КРОСАВЧЕГ, МУАХХАХАХА» — перед тем, как разрядить в героя авиационный пулемет.

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

Вы же не хотите сказать, что 95% учебных материалов по крестам — говно?

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

Неужели ты сам дошел до такой позиции по крестам? Грубо говоря, спустя 5 лет писания на крестах у человека срабатывает таймер и человек перестает писать классы.

Я лишь сказал, что так можно писать и это не будет какой-то ересью. Я читал книги Страуструпа, включая «Дизайн и эволюция С++», и в них не навязывается никакого единого стиля написания кода. Там скорее практичный подход: делай как удобно.

Сам я нетерпимости к классам не испытываю, так как группировать данные и код удобно, наследование и виртуальные методы нужны. Но я не люблю Java-style, когда классы создают на каждый чих, вместо switch используется паттерн стратегия (или виртуальный метод, но даже он может быть перебором) и подобное.

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

Еще раз: на этапе компиляции в следствии мономорфизации параметрический полиморфизм превращается в ad-hoc-полиморфизм, то есть генерируются конкретные реализации для конкретных используемых типов, а вся информация об обобщении стирается: https://godbolt.org/z/zcWj55

Надо заметить, что здесь ты приводишь пример, где компилятору удалось точно установить единственный тип структуры, и он смог найти нужны метод в обход vtable. В примере выше с хранением в vec компилятор уже не смог этого сделать, а потому создал vtable и читает из него адрес функции:

https://rust.godbolt.org/z/PrMP71

Собственно, то же самое умеет делать и C++.

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

Просьба решать свои проблемы с алкоголем в другом месте.

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

смог найти нужны метод в обход vtable

Он ничего не пытается сделать. Это программист решает какой вариант использовать. Хочешь дин. полиморфизм - пиши dyn.

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

Исключения мне нравятся как раз тем, их можно бросить в какой-нибудь функции, расположенной по стеку вызовов на несколько уровней выше (ну или ниже, кому как нравится), чем та, в которой данное исключение будет обработано

Если хотя бы одна из промежуточных функций не поддерживает исключения и оперирует ресурсами, то это будет ошибка рабоыт с памятью. То есть, исключения принципиально делают vendor-lock. Даже растовый возврат ошибок можно сочетать с иными языками, а исключения можно сочетать только с такими же языками на исключениях. Причем, только с точно такими же, другая обработка исключений недопустима. Ладон в win32 есть стандартное соглашение, а в никсах, насколько мне известно, кто как хочет так и... ну ты понял.

Если тебе заставить руками писать всю обработку исключений — ты проклянешь эти исключений. Заметь, что на этом фоне обработка кодов возврата смотрится впоне неплохо. Так почему же ты не хочешь сравнить самую удобную обработку исключений с самой удобной обработкой кодов возврата? Последние как раз свободно конвертируются, и тот же Delphi коды ошибок ActiveX и Win32 оборачивает в исключения. А вот наоборот делать почему-то не получается.

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

ля небольшого домашнего проекта - думаю если сборка на дексктопе с нуля будет укладываться в минуту, а пересборка 1-го cpp с перелинковкой - в 5-10 секунд - будет нормально. Если вот принципиально быстрее - то да, с с++ не по пути

Блин, я просто поражаюсь тому, что такие показатели «для небольшого домашнего проекта» считаются нормой. Норма — это миллион строк с нуля за минуту. Язык можешь отгадать. Достаточно чистые проект на Си в миллион строк выдаст сравнимые показатели, к слову.

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

Он ничего не пытается сделать. Это программист решает какой вариант использовать. Хочешь дин. полиморфизм - пиши dyn

Я не вижу разницы в этих двух кусках кода, там одинаковые конструкции на trait использованы. Но в одном компилятор делает инлайн конкретной функции, а во втором — диспетчеризацию по vtable.

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

Твои суждения: если, если, если. Это все субъективно. Если ты говнокодер, то будет херово, как не посмотри. Я поэтому и упомянул про соглашене об используемой на проекте обработке ошибок. Про память - ну неужили мне тебе рассказывать про умные указатели, захват ресурса и прочее. Ты и сам это знаешь. Тут чистый пример сравнения красного с синим. Ты видишь в исключениях усложнение и обузу. Я вижу красоту и удобство.

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

Твои суждения: если, если, если. Это все субъективно. Если ты говнокодер, то будет херово, как не посмотри

А я тебе предлагаю на минут посмотреть на индустрию. Которая никак не может от крестов избавиться, потому что крестовые либы, как правило, можно использовать только из крестов. Это тупо груз, который тянет на дно всю IT индустрию. Уже давным давно сделано кучу языков, которые имеют сравниму с крестами производительность, и при этом намного более высокоуровневы. Но миграцию останавливает как раз тот факт, что у C++ почти нет готовых решений, которые можно было бы использовать. В этом плане готовых решений у C++ намного меньше, чем у Си. Еще хуже дело обстоит с GC языками, конечно, которые вообще представляют собой бесполезный мусор для индустрии.

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

Ну, и? Ни «Box», ни «dyn» в обоих кусках кода не используется.

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

https://rust.godbolt.org/z/G6G5WT

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

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

Вы же не форумный звездун, вы же легко перечислите эту кучу, не правда ли?

PS. И да, список даже из трех языков кучей считаться не может.

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

Вы же не форумный звездун, вы же легко перечислите эту кучу, не правда ли?

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

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

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

Всё, понял, dyn нашел. Тяжеловато дешифровывать код на расте прост.

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

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

Вы же не форумный звездун, вы же легко перечислите эту кучу, не правда ли?
PS. И да, список даже из трех языков кучей считаться не может

Haskell, диалекты ML, лисп в исполнении SBCL. Это очень большая куча, если попытаться пересчитать по пальцам ЯП из полного списка популярных языков в 2020 году.

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

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

Ты рассуждаешь с позиции «писать ли мне на крестах с исключениями или без?». Я тебе пытаюсь объяснить, что это, мягко говоря, не исчерпывающий список возможных вариантов вне крестов. Это как ставить вопрос «писать ли мне на питоне с GC или без него?» — конечно же с GC лучше. И что теперь, давай писать на C++ с GC?

Исключения в крестах — это сложный, плохо портируемый механизм, который прибит гвоздями к компилятору. С таким же успехом к языку мог бы быть прибит возврат ошибки, который бы внешне, по исходному коду, мало чем отличался от работы исключений, но, при необходимости обрабатывать ошибку явно, кодер требовал бы от компилятора значение ошибки и работал с ним как с возвращаемым значением. К слову, именно так сделаны компоненты ActiveX, и подобное поведение прибито гвоздями к Васику.

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

Haskell, диалекты ML, лисп в исполнении SBCL.

Ожидаемо не получилось ни с кучей, ни со сравнимой производительностью. Да и по поводу «намного более высокоуровневы» вопросов не вызывает разве что Haskell.

Так что звездун как он есть.

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

Haskell, диалекты ML, лисп в исполнении SBCL.

Как из Haskell вызвать код ML, и наоборот? Чтобы не было вендор-лока на реализацию языка.

И со скоростью с++ могут только сравнится диалекты ML.

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

Как из Haskell вызвать код ML, и наоборот? Чтобы не было вендор-лока на реализацию языка

Хаскель умеет дергать сишные функции и принимать вызовы от сишных функций:

https://wiki.haskell.org/Calling_Haskell_from_C

И со скоростью с++ могут только сравнится диалекты ML

Код на хаскеле в императивном стиле дает тот же эффект. Он оказывается медленнее на бенчах только потому, что в компилятор хаскеля не вваливают столько ресурсов, сколько в какие-нибудь GCC, MSVC, ICC, etc.

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

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

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

… в компилятор хаскеля не вваливают столько ресурсов, сколько в какие-нибудь GCC, MSVC, ICC, etc.

Microsoft обязательно портирует Visual Studio и MSVC на Linux.

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

Хаскель умеет дергать сишные функции

Причем тут си? С си у с++ вообще(почти) нет проблем.

Код на хаскеле в императивном стиле дает тот же эффект.

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

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

Слабин не желает признавать свою неправоту, Фалконь.

Владимир

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

Причем тут си? С си у с++ вообще(почти) нет проблем

У крестов нет проблем ровно до тех пор, пока они мимикрируют под Си. Справедливости ради, чисто хаскелевы конструкции таки использовать из Си не получится. Хотя, та же MS работает над интероперабельностью на уровне дотнета: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/babel01.pdf

Код на хаскеле в императивном стиле дает тот же эффект.

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

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

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

У крестов … Си … дотнета

Может быть, ты все таки расскажешь про отсутствие пролблем у «Хаскель, диалектов ML, SBCL».

Хаскель умеет делать строгие вычисления

И как это поможет в показывании «того же эффекта»?

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.