Интересные обсуждения
темы заинтересовавшие velkin
Чем С хуже C++
13.08.2026
|
Marty
|
Здравствуйте!
Мне понадобилось тут как-то написать часть своего проекта в эмбед-варианте на сишечке. А именно — самописный интерпретатор самонагенерённого байткода, я где-то тут об этом расказывал.
И вот чувствую я, что так себе написал, что на плюсах у меня вышло бы лучше и чище, и скорее всего, в рантайме места бы меньше занимало, но вот это только ощущение. Как доказать — не знаю.
Например, такое. Хотя в проекте используется C11, но я уже искалечен C99, или даже более ранним — я в 96ом году в институте полгода на чистой сишечке писал, и всё. Ну и из-за этой травмы я переменные по большей части заранее объявляю, даже если они не во всех ветках нужны. Тут, как минимум, стека в рантайме всегда надо по максимуму.
Или, например, ссылки. В плюсах я их просто использую, а в сишечке — только указатели. А их надо проверять на валидность. А это и исходный код замусоривает, и в рантайме ненужные проверки место занимают.
Или перегрузки. Ну, это скорее всего, только на читаемость/чистоту кода роялит. В C11 какие-то перегрузки вроде как завезли, и я даже немного их попробовал использовать — но, граждане, это какой-то ппц
inline. В плюсах просто пишешь inline, а компилятор сам думает, то ли по месту встроить, то ли вызов оформить. Вроде в C11 тоже какой-то inline, но что-то он мне каким-то стрёмным показался. В сишечке я писал по старинке — отдельно прототип в хидере, отдельно реализация в сишнике.
Или vtbl. Мало того, что всё лежит кишками наружу, так и саму vtbl руками заполняешь, и адрес vtbl в объект присовываешь. Уверен, компилятор сделает это гораздо компактнее.
Ну, и из-за того, что все кишки всем всегда видны, приходится лишние проверки постоянно делать, мало кто чего поломал.
В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
Мне понадобилось тут как-то написать часть своего проекта в эмбед-варианте на сишечке. А именно — самописный интерпретатор самонагенерённого байткода, я где-то тут об этом расказывал.
И вот чувствую я, что так себе написал, что на плюсах у меня вышло бы лучше и чище, и скорее всего, в рантайме места бы меньше занимало, но вот это только ощущение. Как доказать — не знаю.
Например, такое. Хотя в проекте используется C11, но я уже искалечен C99, или даже более ранним — я в 96ом году в институте полгода на чистой сишечке писал, и всё. Ну и из-за этой травмы я переменные по большей части заранее объявляю, даже если они не во всех ветках нужны. Тут, как минимум, стека в рантайме всегда надо по максимуму.
Или, например, ссылки. В плюсах я их просто использую, а в сишечке — только указатели. А их надо проверять на валидность. А это и исходный код замусоривает, и в рантайме ненужные проверки место занимают.
Или перегрузки. Ну, это скорее всего, только на читаемость/чистоту кода роялит. В C11 какие-то перегрузки вроде как завезли, и я даже немного их попробовал использовать — но, граждане, это какой-то ппц
inline. В плюсах просто пишешь inline, а компилятор сам думает, то ли по месту встроить, то ли вызов оформить. Вроде в C11 тоже какой-то inline, но что-то он мне каким-то стрёмным показался. В сишечке я писал по старинке — отдельно прототип в хидере, отдельно реализация в сишнике.
Или vtbl. Мало того, что всё лежит кишками наружу, так и саму vtbl руками заполняешь, и адрес vtbl в объект присовываешь. Уверен, компилятор сделает это гораздо компактнее.
Ну, и из-за того, что все кишки всем всегда видны, приходится лишние проверки постоянно делать, мало кто чего поломал.
В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
| 13.08.2026 34 комментария |
M>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
А разве не очевидно.
1. Обобщённое программирование в C++ даёт ту же производительность, но пишется компактнее, чем в Си, идеально для битомолок.
2. Объектно-ориентированное программирование позволяет применять эту парадигму прямо в языке C++, хотя есть накладные расходы, подходит для движков и фреймворков.
Можно ли написать на Си примерно тоже самое, что на C++. Да можно, это описано в книгах Страуструпа. Однако для задействования парадигм, которые Си не поддерживает нужно писать и следить за большим количеством кода.
А вот минус C++ в том, что люди там занимаются очень долго не созданием алгоритмов, а изучением абстракций. Высокий порог входа, иногда непреодолимый. Плюс в приведённых мною парадигмах получаются чуть ли не чёрные ящики, которые сложно понять. Особенно, когда начинают баловаться с полиморфизмами.
M>>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
V>А разве не очевидно.
Не всегда
V>1. Обобщённое программирование в C++ даёт ту же производительность, но пишется компактнее, чем в Си, идеально для битомолок.
В моём случае — не битоломка, вообще наплевать, как быстро оно исполняется, главное, чтобы занимало минимально места в прошивке
V>2. Объектно-ориентированное программирование позволяет применять эту парадигму прямо в языке C++, хотя есть накладные расходы, подходит для движков и фреймворков.
А теперь то же самое, но для эмбеда с 512 Кб флеша (так-то, это довольно жирно) под прошивку (и который уже и так набит почти под завязку).
V>Можно ли написать на Си примерно тоже самое, что на C++. Да можно, это описано в книгах Страуструпа. Однако для задействования парадигм, которые Си не поддерживает нужно писать и следить за большим количеством кода.
Конкретика, где конкретика?
V>А вот минус C++ в том, что люди там занимаются очень долго не созданием алгоритмов, а изучением абстракций. Высокий порог входа, иногда непреодолимый. Плюс в приведённых мною парадигмах получаются чуть ли не чёрные ящики, которые сложно понять. Особенно, когда начинают баловаться с полиморфизмами.
Я пишу не слишком сложный код. Я как-то устраивался на работу, и в процессе собеса я предложил посмотреть мой код на гитхабе. Главный плюсовик посмотрел-посмотрел, и спросил — ты что, из шарпа в плюсы пришёл? К слову, я туда устроился, и видел код этого главного, там такая ипанина... Долго там не продержался...
M>Я пишу не слишком сложный код. Я как-то устраивался на работу, и в процессе собеса я предложил посмотреть мой код на гитхабе. Главный плюсовик посмотрел-посмотрел, и спросил — ты что, из шарпа в плюсы пришёл? К слову, я туда устроился, и видел код этого главного, там такая ипанина... Долго там не продержался...
мой коллега написал несколько функций смесь С макросы + stl + C++ template и лямбды
отладчик студии сходил сума на этом коде
я не понимаю зачем люди так пишут
S>мой коллега написал несколько функций смесь С макросы + stl + C++ template и лямбды
S>отладчик студии сходил сума на этом коде
S>я не понимаю зачем люди так пишут
S>мой коллега написал несколько функций смесь С макросы + stl + C++ template и лямбды
S>отладчик студии сходил сума на этом коде
S>я не понимаю зачем люди так пишут
В C++ всегда было тяжко с метапрограммированием, в особенности с генерацией кода. Поэтому какие-то проблемы приходилось закрывать макросами. Например, до недавних пор удhttp://обные средства для логирования можно было делать разве что на макросах (до появления в C++20 std::source_location). Но даже в самых современных C++ных стандартах тоже самое логирование бывает удобнее завернуть в макросы, чтобы писать на каком-то более-менее вменяемом DSL, а не заворачивать лямбду внутрь лямбды в лямбде. Не говоря уже про то, что далеко не все проекты могут позволить себе хотя бы C++20 (в 2026-ом году).
А какие-то вещи, увы, из-за отсутствия должных возможностей языка, приходится костылить на макросах (пример использования).
забывл добавить поверх всего там GTEST который как мы выяснили в соседнем топики влияет на компиляцию
я с вами полностью согласен про С++ и метопрограммирование
но в данном случаи это loop над vector of vectors c strings
и вызов одной функции с полученной строкой из вектора строкой
S>но в данном случаи это loop над vector of vectors c strings
S>и вызов одной функции с полученной строкой из вектора строкой
Не видя код сложно судить.
Ну и всегда есть тот фактор, что зачастую нет времени делать "хорошо", нужно сделать хоть что-то. Из-за чего когда сам спустя время смотришь на сделанное собой же сразу видишь как можно было проще/надежнее/эффективнее.
S>отладчик студии сходил сума на этом коде
отладчик ладно, у нас был код, который компилятор студии крэшил.
S>>отладчик студии сходил сума на этом коде
_>отладчик ладно, у нас был код, который компилятор студии крэшил.
Это с компиляторами случается иногда, хоть и нечасто.
V>>1. Обобщённое программирование в C++ даёт ту же производительность, но пишется компактнее, чем в Си, идеально для битомолок.
M>В моём случае — не битоломка, вообще наплевать, как быстро оно исполняется, главное, чтобы занимало минимально места в прошивке
Обобщённое программирование можно рассматривать как текстовый генератор с подстановкой на этапе компиляции. Есть шаблон, а в треугольных скобках указывается, что будет в него подставлено. Код прошивки при этом будет увеличиваться на каждое уникальное сочетание. А вот занимаемая данными память будет соответствовать тому, что и сгенерировано.
Генерируй одно сочетание, и тогда прошивка не увеличится по сравнению с Си. Или просто спроси нейронку про прочие методы экономия памяти. Давай я за тебя её спрошу.
Поисковый запрос Google AI Mode.
V>>2. Объектно-ориентированное программирование позволяет применять эту парадигму прямо в языке C++, хотя есть накладные расходы, подходит для движков и фреймворков.
M>А теперь то же самое, но для эмбеда с 512 Кб флеша (так-то, это довольно жирно) под прошивку (и который уже и так набит почти под завязку).
Под накладными расходами я имею в виду тот же полиморфизм, те же таблицы виртуальных функций и так далее. Но в принципе никто не мешает писать на C++ в стиле Си. Например, использовать те же структуры и функции. А в C++ структура и класс это одно и тоже, различие только в модификаторе доступа по умолчанию, у структуры public, у класса private.
Мораль в том, что в C++ можно точно так же выравнивать переменные в памяти как и в Си, то есть порядок объявления в структуре или классе имеют значение. В данном случае ключевое слово struct можно использовать как синтаксический сахар вместо class или для обратной совместимости с Си.
V>>Можно ли написать на Си примерно тоже самое, что на C++. Да можно, это описано в книгах Страуструпа. Однако для задействования парадигм, которые Си не поддерживает нужно писать и следить за большим количеством кода.
M>Конкретика, где конкретика?
У Страуструпа есть книги.
1. Язык программирования C++. 3-е специальное издание, 4-е издание.
2. Дизайн и эволюция языка C++. 1-е издание.
3. Программирование принципы и практика использования C++. 1-е издание, 2-е издание.
Например, в книге "Язык программирования C++. 3-е специальное издание" в 10 главе пишут как преобразовать программу на Си в программу на C++. Обучение классам по сути идёт через последовательное преобразование из структур в стиле Си в классы в стиле C++. Сделай наоборот и получишь структуры в стиле Си. Здесь важно отметить, что структуры именно в стиле Си, а не структуры Си.
Можно почитать "Дизайн и эволюция языка C++". Хотя в книгах обычно проводятся поверхностные знания, но чем слушать какой-то левый трёп на форуме от незнакомых людей лучше уж ознакомиться с первоисточником почему получилось так, а не иначе.
V>>А вот минус C++ в том, что люди там занимаются очень долго не созданием алгоритмов, а изучением абстракций. Высокий порог входа, иногда непреодолимый. Плюс в приведённых мною парадигмах получаются чуть ли не чёрные ящики, которые сложно понять. Особенно, когда начинают баловаться с полиморфизмами.
M>Я пишу не слишком сложный код. Я как-то устраивался на работу, и в процессе собеса я предложил посмотреть мой код на гитхабе. Главный плюсовик посмотрел-посмотрел, и спросил — ты что, из шарпа в плюсы пришёл? К слову, я туда устроился, и видел код этого главного, там такая ипанина... Долго там не продержался...
В последний раз я языки .NET использовал во времена Visual Studio .NET 2003 и Visual Studio .NET 2005. А потом я захотел кроссплатформу и выяснилось, что Mono работает коряво. А Wine тоже вроде как ставить с накатыванием .NET не очень.
Но что я помню об этом всём, что .NET это объектно-ориентированное программирование. В общем и целом по стилю очень похоже на фреймворк Qt. Но вот C++ из коробки идёт с STL, а STL это обобщённое программирование. Обобщённое программирование это совершенно другой стиль, нежели объектно-ориентированный. А их ещё можно и сочетать.
И там и там можно использовать полиморфизм, но это разный полиморфизм и работает он по-разному. В обобщённом это генерация кода, в объектно-ориентированном виртуальные таблицы.
Я не буду утверждать, но скорее всего после .NET тот же Qt и другие объектно-ориентированные библиотеки покажутся тебе родными. Напротив Stl, Boost и прочие обобщённые библиотеки будут выглядеть как "ипанина", особенно если кто-то их не просто использует, а программирует в этой парадигме. И конечно ты можешь писать на C++ в стиле Си.
А это считай как три совершенно разных программиста. Нет такого, что я программист на C++ под любой проект и точка. Нет, ты
1. или программист на C++ в стиле Си,
2. или программист на C++ в стиле объектно-ориентированного программирования,
3. или программист на C++ в стиле обобщённого программирования.
И в каждом можно считать, что есть древо развития как в какой-нибудь ММОРПГ игре, то есть сколько умений у тебя есть. Причём я лично застрял где-то в районе C++ 2003, потому не могу сказать, что там не появилось что-то ещё. Я про функциональное программирование, которое вроде как стартовало только с C++ 2011 и прокачивалось от версии к версии.
В общем я считаю, что для повышения квалификации нужно общаться с нейронками. По сути это те же тексты и коды созданные людьми, только в новой обёртке. Смысла в тех же людях нет пока ты можешь сформулировать свой вопрос.
А если тебе нужны академические знания, тогда качай книги через тот же Тор, если нет доступа.
https://libgen.li/
Хотя книги читать долго и они не совершенны, то есть для становления профи нужно соединить несколько объёмов книг. А ещё как по мне каждому человеку работающему с информацией нужна личная база знаний. В любом случае другие люди не нужны, разве что они делают всё за тебя. Для толстосумов ничего не поменялось.
Короче заливай свои вопросы в нейронку, хотя бы в поиск.
https://google.com/aimode
В нейронках уже достаточно информации чтобы получить ответ. Просто кто-то всё ещё задаёт вопрос как я, а кто-то уже говорит нейронке сделать всё самой, чтобы там в памяти было экономно и так далее. Это разрыв между мышлением тех кто учился без нейронок и тех кто адаптировался к их возрастающим возможностям.
Опять же вот написал ты какой-то код, ну и хорошо. За тебя ведь его всё равно никто писать не будет включая запросы к нейронкам. Рефлексировать можно сколько угодно. Например, по поводу аспектов, то есть не функциональных проверок указателей и прочего. Кстати, если почитать книгу Страуструпа "Дизайн и эволюция языка C++", то тебе там объяснят, что выделение памяти в куче делает программу медленней, указатели часто для этого и используются.
Вообще-то я вывел некую теорию архитектуры программ. Исходя из неё программирование движется в сторону ограничений от свободного текста, к инструкциям языка, от инструкций языка, к пользовательским конструкциям, таким как общая архитектура программы, шаблоны проектирования, идиомы, алгоритмы, аспекты и прочее.
Но мораль в том, что обычный прикладной программист это просто рабочий. Ему вредно над таким слишком много думать, а нужно просто копать. Иначе можно стать теоретиком без практической пользы.
По сути не обязательно нужны проверки тех же указателей, потому что программа может быть написана так, что всё будет работать. Или проверки могут быть только в отладочной версии. Каждый раз люди сами принимают решения, что писать, а что не писать, это я и называю ограничениями.
Например.
1. Использовать глобальные функции. Да/Нет.
2. Использовать классы. Да/Нет.
3. Использовать указатели. Да/Нет.
И внутри в древовидном списке.
1. Использовать глобальные функции. Да/Нет.
1.*. Возвращать только типы void в глобальных функциях. Да/Нет.
2.*. Использовать параметры глобальных функций. Да/Нет.
...
2. Использовать классы. Да/Нет.
2.1. Использовать модификаторы классов. Да/Нет.
2.2. Использовать конструкторы классов. Да/Нет.
...
3. Использовать указатели. Да/Нет.
3.1. Использовать проверку указателей на ноль. Да/Нет.
3.1. Использовать указатели на константу. Да/Нет.
...
Ну и так далее. То есть смысл здесь в том, что ограничений может быть тысячи, десятки тысяч, сотни тысяч, миллионы. Люди способны их помнить, но не способны улавливать в коде. Для этого нужен специальный инструмент, который бы сохранял диапазоны текста и позволял конструировать код с учётом ограничений.
А инструмента пока нет. Программисты пользуются своими мозгами, ну или даже нейронками. И хоть зарефлексируйся, если не учёл какое-то ограничение, значит не учёл.
Что касается чсвшников, то учитывая нейронки их время прошло. Зачем общаться с людьми, которые привыкли писать код так как привыкли. Ценность имеют лишь крупные проекты, которые писали коллективы десятилетиями. Это базы данных, графические движки, фреймворки и прочее.
А вот эти мелкие утилитки от кодерков могут быть написаны хоть через пень колоду. Включая заказные решения для каких-то компаний. Мне здесь же на форуме так и сказали, что эти компании долго не проживут. Потому типа на принципы Страуструпа, когда софт должен работать спустя десятилетия можно забить.
Может что-то и не в тему написал, ну да всё равно. Раньше ценность общения падала из-за открытости сообществ и динамических сайтов веб 2.0. Теперь нейронки всё равно тебе объяснят всё лучше и точнее, чем любой из комментаторов.
V>Генерируй одно сочетание, и тогда прошивка не увеличится по сравнению с Си. Или просто спроси нейронку про прочие методы экономия памяти. Давай я за тебя её спрошу.
V>Поисковый запрос Google AI Mode.
V>
Зачем этот нейрослоп? Думаешь, я что-то из этого не знаю?
V>>>2. Объектно-ориентированное программирование позволяет применять эту парадигму прямо в языке C++, хотя есть накладные расходы, подходит для движков и фреймворков.
M>>А теперь то же самое, но для эмбеда с 512 Кб флеша (так-то, это довольно жирно) под прошивку (и который уже и так набит почти под завязку).
V>Под накладными расходами я имею в виду тот же полиморфизм, те же таблицы виртуальных функций и так далее. Но в принципе никто не мешает писать на C++ в стиле Си. Например, использовать те же структуры и функции. А в C++ структура и класс это одно и тоже, различие только в модификаторе доступа по умолчанию, у структуры public, у класса private.
Спасибо Кэп
V>Мораль в том, что в C++ можно точно так же выравнивать переменные в памяти как и в Си, то есть порядок объявления в структуре или классе имеют значение. В данном случае ключевое слово struct можно использовать как синтаксический сахар вместо class или для обратной совместимости с Си.
Я в курсе
V>>>Можно ли написать на Си примерно тоже самое, что на C++. Да можно, это описано в книгах Страуструпа. Однако для задействования парадигм, которые Си не поддерживает нужно писать и следить за большим количеством кода.
M>>Конкретика, где конкретика?
V>У Страуструпа есть книги.
V>1. Язык программирования C++. 3-е специальное издание, 4-е издание.
V>2. Дизайн и эволюция языка C++. 1-е издание.
V>3. Программирование принципы и практика использования C++. 1-е издание, 2-е издание.
Есть. Я их читал. И?
V>Например, в книге "Язык программирования C++. 3-е специальное издание" в 10 главе пишут как преобразовать программу на Си в программу на C++. Обучение классам по сути идёт через последовательное преобразование из структур в стиле Си в классы в стиле C++. Сделай наоборот и получишь структуры в стиле Си. Здесь важно отметить, что структуры именно в стиле Си, а не структуры Си.
V>Можно почитать "Дизайн и эволюция языка C++". Хотя в книгах обычно проводятся поверхностные знания, но чем слушать какой-то левый трёп на форуме от незнакомых людей лучше уж ознакомиться с первоисточником почему получилось так, а не иначе.
Вот ты точно ничего полезного не говоришь
M>>Я пишу не слишком сложный код. Я как-то устраивался на работу, и в процессе собеса я предложил посмотреть мой код на гитхабе. Главный плюсовик посмотрел-посмотрел, и спросил — ты что, из шарпа в плюсы пришёл? К слову, я туда устроился, и видел код этого главного, там такая ипанина... Долго там не продержался...
V>В последний раз я языки .NET использовал во времена Visual Studio .NET 2003 и Visual Studio .NET 2005. А потом я захотел кроссплатформу и выяснилось, что Mono работает коряво. А Wine тоже вроде как ставить с накатыванием .NET не очень.
Я на C# никогда не писал
V>Но что я помню об этом всём, что .NET это объектно-ориентированное программирование. В общем и целом по стилю очень похоже на фреймворк Qt. Но вот C++ из коробки идёт с STL, а STL это обобщённое программирование. Обобщённое программирование это совершенно другой стиль, нежели объектно-ориентированный. А их ещё можно и сочетать.
Я в курсе
V>Я не буду утверждать, но скорее всего после .NET тот же Qt и другие объектно-ориентированные библиотеки покажутся тебе родными. Напротив Stl, Boost и прочие обобщённые библиотеки будут выглядеть как "ипанина", особенно если кто-то их не просто использует, а программирует в этой парадигме. И конечно ты можешь писать на C++ в стиле Си.
V>А это считай как три совершенно разных программиста. Нет такого, что я программист на C++ под любой проект и точка. Нет, ты
V>1. или программист на C++ в стиле Си,
V>2. или программист на C++ в стиле объектно-ориентированного программирования,
V>3. или программист на C++ в стиле обобщённого программирования.
Почему "или"? Я вполне и 2 и 3 сочетаю
V>
Зачем этот нейрослоп?
V>Может что-то и не в тему написал, ну да всё равно. Раньше ценность общения падала из-за открытости сообществ и динамических сайтов веб 2.0. Теперь нейронки всё равно тебе объяснят всё лучше и точнее, чем любой из комментаторов.
Ты вообще ничего по теме не написал
V>
Зачем эти простыни?
M>Зачем этот нейрослоп? Думаешь, я что-то из этого не знаю?
M>Спасибо Кэп
M>Я в курсе
M>Есть. Я их читал. И?
M>Вот ты точно ничего полезного не говоришь
С твоей точки зрения скорее всего да. Хотя давай начистоту.
1. Зачем ты создаёшь эти нубо топики в эпоху нейронок?
2. Покажи комментарии в теме, которые оказались для тебя наиболее полезными, хотелось бы узнать, что это за такие шедевры мысли.
С моей стороны это выглядит как и в старые добрые времена. Очередной чсвшник создаёт тему. Потом начинает вайнить, ой, мне неправильно ответили.
Вот поэтому в современную эпоху это всё балабольство ни о чём. Нейронки теперь редко галлюцинируют на простых вопросах и ответах.
Я серьёзно, если человек читал книжки по C++, может советоваться с кучей нейронок, то зачем ему этот нубо топик? Чтобы вайнить и чсвшить?
Это иллюзия живого общения. Вот ты говоришь нейрослоп. Но это нейрослоп не из-за ошибок в тексте, а из-за того, что запрос сделал я, а не ты.
Сделай цепочку интересных именно тебе запросов. Или продолжай пребывать в старой иллюзии, что ты типа общаешься с пользой. Нет, с точки зрения технологий ты общаешься чтобы зря потратить время.
Оглянись, люди больше не спрашивают, что и как сделать у других людей напрямую. Я C++ смотрю давно. У меня ещё есть печатная книжка 1999 года на которой так и написано "Язык программирования C++" 3-е издание. Да и до этого покупал другие книги. Да и давно уже перешёл на электронные.
Так и скажи мне, если это не тема просто повайнить и почсвшить, в чём смысл вопроса "Чем С хуже C++?". Потому что я таких людей как ты воспринимаю всегда одинаково, но может я всё это время был не прав.
Ещё раз повторю, ты что ждёшь какого-то божественного откровения от своего вопроса? Мне действительно интересно.
Некоторые тоже ещё ходят и вайнят, что у меня много написано и всё впустую. Типа у них пара строчек и дело в шляпе. А я тебе так скажу, вот эти все ваши комментарии это ни о чём. Нормальные люди просто пишут код, который работает и всё, им форум не нужен.
Потому что если исходить из чистой рациональности, когда нужен результат, а не балабольство, то форумы сейчас будут абсолютно пустыми. Я не вижу, чтобы ты удовлетворял технологическую потребность. Психологическую да, возможно, Пирамида потребностей по Маслоу.
Тогда давай честно признаемся, что есть люди с которыми тебе хотелось бы пообщаться. Это скорее всего не я. Но именно пообщаться, а не извлечь какую-то практическую пользу.
Вот даже я. Когда мне нужна польза, я открою в первую очередь документацию и спецификацию для серьёзного вхождения в тему. Высший уровень это читать и разбирать исходный код.
Для нубо вхождения есть книги. Ещё более быстрый, но менее качественный вариант статьи. Когда в голове складывается некое представление начинают работать запросы к нейронкам.
Я сам создавал на рсдн топики с вопросами, но это были голосования. Что вы предпочитаете и так далее. А не некую абстракцию, чтобы потом сказать: "Вы ничего не понимаете!".
Ну вот смотри с ходу для чего ты спрашиваешь.
1. Чтобы узнать что-то новое. На мой взгляд вряд ли ты что-то новое узнаешь. И есть гораздо более быстрые способы получить знания.
2. Чтобы выпендриться, потребность в престиже. Но тогда у тебя вайно чсвшный стиль разговора. А выпендриться не получится, потому что нейронки лучше тебя, или меня, или даже остальных участников форума. Нейронки не обижаются, они просто отвечают используя мировую базу знаний.
3. Удовлетворить потребность в общении. То есть ты понимаешь, что это просто болтовня ни о чём, но потребность в общении хотя и стоит после еды, воды и дыхания, но тоже является потребностью.
И так далее. Список голосования ты не подготовил "Чем С хуже C++?", хотя мог бы.
А есть гипотеза Стивена Крашена об усвоении языка, в частности гипотеза входного материала. На этом форуме я не видел чтобы кто-то кроме меня писал об этом.
Твой вопрос раскладывается на.
Чем
С
хуже
C++
Из него можно собрать древовидные списки и подменять внутри слова. На основе их получатся различные последовательности.
Я к тому, что ты свои же слова никак не разбираешь (анализируешь). Тебе нормально, что у тебя в голове что-то прощёлкивает, вайн, чсв или ещё что, а потом выходит очередное: "Я Д’Артаньян. Ты каналья.".
Конечно, это по твоему всё нейрослоп, словесный понос и так далее. Вот я тебе и говорю, у тебя на самом деле нет цели действительно в чём-то разобраться. Или с кем-то поговорить, чтобы что-то понять.
Ты когда подготавливал этот вопрос не применил никаких усилий, чтобы показать, что знаешь по этой теме. Просто написал что-то от балды и всё. То есть ты себя в своём вопросе позиционируешь как нуб, а ответы у тебя в стиле пупа земли и суперэксперта, но тоже ни о чём.
Я не вижу твой код и следовательно крутизну, но и основания подвергать твою якобы экспертность у меня нет. Но тут как раз и возникает вопрос зачем ты создал этот топик, если такой крутой эксперт? Ты сам-то можешь сформулировать зачем?
Или будет очередной "гениальный" ответ, проскипал, всё мусор. Скип, скип, я всё знаю, ты дурак, я гений, бла бла бла. Ради вот этого создают топики подобные тебе? Ну ясно понятно.
Я, кстати, не в претензии. Потому и говорю, хочешь чтобы всё было по твоему, создавай свой закрытый сайт, что я и сделал лично для себя.
V>А разве не очевидно.
V>1. Обобщённое программирование в C++ даёт ту же производительность, но пишется компактнее, чем в Си, идеально для битомолок.
Вот тут статья, о том, что на С фиг ты повторишь то, что можно на С++. То есть теоретически можно было бы попытаться, но никто бы так не делал.
N>Вот тут статья, о том, что на С фиг ты повторишь то, что можно на С++. То есть теоретически можно было бы попытаться, но никто бы так не делал.
Дык потому что автор изначально задачу поставил не правильно.
M>Здравствуйте!
M>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
Ни чем не хуже, а даже лучше
M>>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
_>Ни чем не хуже, а даже лучше
Говорят, что на любое говно в нашем мире обязательно найдутся любители этого самого говна.
Теплая ламповая Си-шечка доказывает это еще даже лучше, чем C++.
M>И вот чувствую я, что так себе написал, что на плюсах у меня вышло бы лучше и чище, и скорее всего, в рантайме места бы меньше занимало, но вот это только ощущение. Как доказать — не знаю.
Хочешь протащить C++ на платформу, где раньше С обходились?
M>Например, такое. Хотя в проекте используется C11, но я уже искалечен C99, или даже более ранним — я в 96ом году в институте полгода на чистой сишечке писал, и всё. Ну и из-за этой травмы я переменные по большей части заранее объявляю, даже если они не во всех ветках нужны. Тут, как минимум, стека в рантайме всегда надо по максимуму.
Я думаю, тут компилятор сам разберётся.
M>Или, например, ссылки. В плюсах я их просто использую, а в сишечке — только указатели. А их надо проверять на валидность. А это и исходный код замусоривает, и в рантайме ненужные проверки место занимают.
Ну ты ведь не думаешь, что функция типа strlen() проверяет указатели на валидность? Или что fprintf() проверает на валидность свой первый аргумент. Тот, который FILE*.
Указатели надо проверять на валидность, если есть разумные основания предполагать, что указатель может быть невалидным. А не просто на всякий случай.
M>inline. В плюсах просто пишешь inline, а компилятор сам думает, то ли по месту встроить, то ли вызов оформить. Вроде в C11 тоже какой-то inline, но что-то он мне каким-то стрёмным показался. В сишечке я писал по старинке — отдельно прототип в хидере, отдельно реализация в сишнике.
В сишечке так же.
Но на самом деле, и в C и в C++, inline — это такая вежливая просьба к компилятору. Которую он не обязан исполнять. Кстати, и отсутствие inline не означает, что функция не заинлайнится.
M>Или vtbl. Мало того, что всё лежит кишками наружу, так и саму vtbl руками заполняешь, и адрес vtbl в объект присовываешь. Уверен, компилятор сделает это гораздо компактнее.
Компилятор сделает vtbl одну на тип, и в экземпляре на неё сошлётся.
В C обычно эквивалент vtbl пихают прямо в структуру.
Вариант C++ компактнее, но добавляет лишнее разыменования указателя.
M>Ну, и из-за того, что все кишки всем всегда видны, приходится лишние проверки постоянно делать, мало кто чего поломал.
Многие кишки можно скрыть.
Например, в ашнике — typedef struct foo foo; а саму struct foo расписывать только там, где положено видеть её внутренности.
M>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
У меня нормально всё получается.
Pzz>У меня нормально всё получается.
Не у всех хватает прилежания выписывать последовательности mem_free или запоминать когда старое значение нужно удалить перед присваиванием нового.
Более того, некоторые настолько ленивы, что вынуждены задаваться вопросом: а нахрена все это делать вручную?
Кстати говоря, я вот чего не понял. У вас есть conf_load_from_ini. Она не возвращает никакого признака ошибки, если в процессе парсинга что-то пошло не так (например, встретилась ошибка синтаксиса и вы просто это печатаете в лог). Но, например, в conf_load_from_file, откуда conf_load_from_ini вызывается, вы даже не узнаете, что в conf_load_from_ini была диагностирована ошибка (и, возможно, не одна).
Это дизайн такой?
S>Не у всех хватает прилежания выписывать последовательности mem_free или запоминать когда старое значение нужно удалить перед присваиванием нового.
Некоторые умудряются и на плюсиках ТАКОГО насвистеть...
S>Более того, некоторые настолько ленивы, что вынуждены задаваться вопросом: а нахрена все это делать вручную?
Это настолько малая часть разработки этого драйвера, что тонет в шуме.
Большая часть времени ушла на тонкое выплясывание вокруг багов прошивок устройств, доступных мне исключительно по переписке с владельцами.
S>Кстати говоря, я вот чего не понял. У вас есть conf_load_from_ini. Она не возвращает никакого признака ошибки, если в процессе парсинга что-то пошло не так (например, встретилась ошибка синтаксиса и вы просто это печатаете в лог). Но, например, в conf_load_from_file, откуда conf_load_from_ini вызывается, вы даже не узнаете, что в conf_load_from_ini была диагностирована ошибка (и, возможно, не одна).
S>Это дизайн такой?
Ну в общем-то да.
Мне в этом месте особо-то некуда жаловаться. Если sane_init вернёт ошибку, SANE молча сглотнёт и драйвер просто не загрузится.
Конечно, если я не могу проинициализироваться до работоспособного состояния, мне приходится так делать. Но ошибку загрузки конфигурации я не считаю достаточно важной причиной, чтобы не загрузить драйвер. Там нет каких-то особо критических параметров в этой конфигурации, чтобы при незагрузке её просто сломаться. Дефолтовое поведение вполне разумное, конфигурацию приходится трогать в основном при разбирательстве с какими-то проблемами на объекте.
S>>Не у всех хватает прилежания выписывать последовательности mem_free или запоминать когда старое значение нужно удалить перед присваиванием нового.
Pzz>Некоторые умудряются и на плюсиках ТАКОГО насвистеть...
Можно пример?
S>>Более того, некоторые настолько ленивы, что вынуждены задаваться вопросом: а нахрена все это делать вручную?
Pzz>Это настолько малая часть разработки этого драйвера, что тонет в шуме.
Странная логика. Даже C++98 позволил бы сделать все тоже самое гораздо компактнее и надежнее.
Хотя складывается впечатление, что для таких задач вообще языки с ручным управлением памятью и не нужны.
M>>И вот чувствую я, что так себе написал, что на плюсах у меня вышло бы лучше и чище, и скорее всего, в рантайме места бы меньше занимало, но вот это только ощущение. Как доказать — не знаю.
Pzz>Хочешь протащить C++ на платформу, где раньше С обходились?
Почему нет? На плюсах производительность в несколько раз выше. На сишечке большую часть времени тратишь на борьбу с её уродством.
M>>Или, например, ссылки. В плюсах я их просто использую, а в сишечке — только указатели. А их надо проверять на валидность. А это и исходный код замусоривает, и в рантайме ненужные проверки место занимают.
Pzz>Ну ты ведь не думаешь, что функция типа strlen() проверяет указатели на валидность? Или что fprintf() проверает на валидность свой первый аргумент. Тот, который FILE*.
Pzz>Указатели надо проверять на валидность, если есть разумные основания предполагать, что указатель может быть невалидным. А не просто на всякий случай.
Ну, возможно
Pzz>Но на самом деле, и в C и в C++, inline — это такая вежливая просьба к компилятору. Которую он не обязан исполнять. Кстати, и отсутствие inline не означает, что функция не заинлайнится.
Каким образом, если код в отдельном сишнике? Только если шибко умное LTO
M>>Или vtbl. Мало того, что всё лежит кишками наружу, так и саму vtbl руками заполняешь, и адрес vtbl в объект присовываешь. Уверен, компилятор сделает это гораздо компактнее.
Pzz>Компилятор сделает vtbl одну на тип, и в экземпляре на неё сошлётся.
Pzz>В C обычно эквивалент vtbl пихают прямо в структуру.
Pzz>Вариант C++ компактнее, но добавляет лишнее разыменования указателя.
Видел. Довольно спорное решение
M>>Ну, и из-за того, что все кишки всем всегда видны, приходится лишние проверки постоянно делать, мало кто чего поломал.
Pzz>Многие кишки можно скрыть.
Pzz>Например, в ашнике — typedef struct foo foo; а саму struct foo расписывать только там, где положено видеть её внутренности.
Это куча ручного гемора
M>>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
Pzz>У меня нормально всё получается.
Вопрос, какой ценой.
Вот я про свою систему рассказывал, написал бы ты её на сишечке? Лично я — даже и пытаться бы не стал
Pzz>>Но на самом деле, и в C и в C++, inline — это такая вежливая просьба к компилятору. Которую он не обязан исполнять. Кстати, и отсутствие inline не означает, что функция не заинлайнится.
M>Каким образом, если код в отдельном сишнике? Только если шибко умное LTO
Как и в плюсиках, компилятор может поинлайнить только то, что видит.
Т.е., или суём инлайновую функцию в хидер, или пишем её внутри compilation unit, и внутри него и инлайнится.
Pzz>>Многие кишки можно скрыть.
Pzz>>Например, в ашнике — typedef struct foo foo; а саму struct foo расписывать только там, где положено видеть её внутренности.
M>Это куча ручного гемора
Ну, не знаю. Я привык
M>Вопрос, какой ценой.
M>Вот я про свою систему рассказывал, написал бы ты её на сишечке? Лично я — даже и пытаться бы не стал
Написал бы.
M>>Это куча ручного гемора
Pzz>Ну, не знаю. Я привык
M>>Вопрос, какой ценой.
M>>Вот я про свою систему рассказывал, написал бы ты её на сишечке? Лично я — даже и пытаться бы не стал
Pzz>Написал бы.
За какой срок?
У меня там 50К строк вроде где-то. На плюсах. На сишечке — это раз в пять больше писать, имхо. Плюс во всю используются различные контейнеры, в тч. ассоциативные.
ЗЫ 50К строк — это только то, что ушло в прод. Ещё порядка 50 тестов на разные темы, они тоже жирные. Это не классические юнит или как их тесты, каждый тест был создан для исследования какой-то проблемы, или для проверки гипотез. Например, один из них, один из простых — это сравнение порядка десятка алгоритмов хеширования на моих именах
M>>>Вот я про свою систему рассказывал, написал бы ты её на сишечке? Лично я — даже и пытаться бы не стал
Pzz>>Написал бы.
M>За какой срок?
А ты за какой написал?
M>У меня там 50К строк вроде где-то. На плюсах. На сишечке — это раз в пять больше писать, имхо. Плюс во всю используются различные контейнеры, в тч. ассоциативные.
Ну, не в пять, конечно.
Я, как ты знаешь, активно юзаю C и Go. Go, так, по ощущениям, сокращает объем кода раза в 2-3. Полагаю, C++ где-то плюс-минус сравним.
В целом, на Си жить можно, но временами лениво.
Бесит, кстати, не ручное управление памятью и отсутствие простейших алгоритмов, типа хеш-таблиц. Больше всего бесит то, что в сишной библиотеке не хватает вещей, типа стандартного HTTP-клиента и сервера.
M>>>>Вот я про свою систему рассказывал, написал бы ты её на сишечке? Лично я — даже и пытаться бы не стал
Pzz>>>Написал бы.
M>>За какой срок?
Pzz>А ты за какой написал?
На текущий момент 11 месяцев прошло. Механизм полностью работает на ПК, но в железо пока не запихал
M>>У меня там 50К строк вроде где-то. На плюсах. На сишечке — это раз в пять больше писать, имхо. Плюс во всю используются различные контейнеры, в тч. ассоциативные.
Pzz>Ну, не в пять, конечно.
Конечно в пять, а то и больше. Там, где я пишу одну или две шаблонных функций, например, которые обрабатывают знаковые и беззнаковые интегральные типы, на сишечке я должен написать их с десяток и даже больше.
Pzz>Я, как ты знаешь, активно юзаю C и Go. Go, так, по ощущениям, сокращает объем кода раза в 2-3. Полагаю, C++ где-то плюс-минус сравним.
А Go ты как раз и юзаешь, потому что сишечка убога. Но я Go не знаю, мне плюсов хватает, поэтому не могу сравнить их.
Pzz>В целом, на Си жить можно, но временами лениво.
Жить-то можно, но хреново
Pzz>Бесит, кстати, не ручное управление памятью и отсутствие простейших алгоритмов, типа хеш-таблиц. Больше всего бесит то, что в сишной библиотеке не хватает вещей, типа стандартного HTTP-клиента и сервера.
Ну хз, а как же ты без базовых контейнеров обходишься? Со стороны что-то тянуть приходится?
А HTTP нет и в плюсах, но можно сторонний взять, коих куча. А vcpkg + CMake позволяют делать это достаточно просто
M>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
компилятор c++ написан на с.
M>>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
_>компилятор c++ написан на с.
Какой?
M>>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
_>компилятор c++ написан на с.
Эээ. В случае LLVM вроде наоборот, компилятор C написан на C++
Pzz>Эээ. В случае LLVM вроде наоборот, компилятор C написан на C++
GCC уже давно требует для компиляции C++ный компилятор, хотя изначально был написан на Си. Компилятор от Microsoft тоже уже давным-давно на С++.
Так что найти современный C++ный компилятор, который был бы написан на Си, еще нужно постараться.
_>>компилятор c++ написан на с.
Pzz>Эээ. В случае LLVM вроде наоборот, компилятор C написан на C++
GCC тоже давно уже на плюсах переписали. Но, я думаю, с минимальным использованием. Думаю, им RAII наверное понадобилось.
А вот кланг — он да, он вообще насквозь супер плюсовый.
MSVC — хз, но уверен, тоже давно на плюсах
M>MSVC — хз, но уверен, тоже давно на плюсах
Эти, небось, давно всё на TypeScript переписали
Q>Так то я работаю в основном в эмбедед. В последнее время работаю с любителями C хотя до этого в основном на C++. На самом деле все эти слухи от старперов что якобы для ембедед тлько C а C++ типа ни в коем случае а то блин все сразу станет супермедленнее или там вообще ненадежно. Да и компиляторы на C++ есть на все платформы почти. Мало того что то, что выходит на C, слабоватее функционально в смысле не особо фичастое по сравнению с C++ и с последующим добавлением чего-то нового не такого как исначально задумано часто проблемы, так еще и у каждой отдельной хрени есть свой автор-хозяин, который только знает чо там и как и то не факт что на 100%. В то время как на C++ легко было людей с одной хрени на другую переводить, почти без проблем. Типа глянул тут клас, здесь класс, такие там данные в классе, так то они взаимодействуют, тудя сюда и разобрался. А в C: функции, функции, функции..... и переменные . Начинаешь разбираться так, так, так и все... уже забыл откуда начал и почему это все так.
Но это же лучше сем java где за тоннами фасадов, интерфейсов, стратегияй и фабрик, не так просто найти реализацию если не знаешь где искать. И это не проблема языка, а такая архитектура.
Вообще бардак не зависит от языка программирования. Хорошо структурированный код при желании можно делпть даже на басике. И потом хороший физик на любом языке моджет писать фортраном.
M>В общем, плюсовики, если кто на сишечке писал, накидайте, чем для вас сишечка хуже плюсиков. И насколько код медленее и больше получался
я отметил только один плюс С по сравнению с С++ (у которого как известно их только два): данные и функции жёстко разделены. Заставляет писать код менее связный. Легче тестировать и т. д. Хотя в умелых руках любую идею можно похерить.
В остальном конечно С++ богаче.