LINUX.ORG.RU

Производительность C++

 ,


7

13

Как насчёт производительности у C++ по сравнению с C? Мои предположения на текущий момент:

1) Код, не использующий возможности C++ (то есть по сути plain C), скомпилированный C++ компилятором будет иметь абсолютно ту же производительность, что и код на С.

2) Исключения и dynamic_cast медленные. Если нам важна производительность, лучше их не использовать.

3) Класс без виртуальных методов, должен быть по производительности эквивалентен сишной структуре и функциям, обрабатывающим её. Не считая копирования. Нужно везде, где можно использовать передачу по указателю или ссылке (собственно, если в Си делать memmove при передаче структуры в качестве аргумента, то это вызовет примерно такой же оверхед, как дефолтный конструктор копирования С++. Верно?).

4) Класс с виртуальными методами полностью аналогичен пункту 3, но при вызове виртуальных методов добавляется небольшой оверхед. Сишный эквивалент obj->vtable->func(obj, ...). Если сравнивать с plain C кодом, реализующим ООП в той же манере (каждая структура-объект имеет поле, указывающее на структуру, содержащую адреса функций работы с ней), то оверхеда по сравнению с plain C не должно быть.

5) При использовании атрибута класса final (если компилятор поддерживает соответствующий стандарт) даже при наличии виртуальных методов в нём, их вызов будет превращаться в прямые вызовы функций вместо обращения к vtable, если переменная имеет соответствующий тип, а не указатель/ссылка на его предка (который не final).

6) Шаблоны могут привести к разбуханию кода. Впрочем, #define-ы и inline-функции в C++ могут устроить то же самое. Вопрос: будет ли использование шаблона с одинаковыми параметрами создавать 2 копии реализации или же всё-таки компилятор догадается сделать её лишь один раз. А если шаблон используется с одинаковыми параметрами в нескольких объектных файлах? Будет ли реализация расшариваться между ними или у каждого своя?

7) Что насчёт inline-методов класса? (те, которые описываются прямо в момент определения самого класса, внутри блока class). Может ли их реализация расшариваться между модулями или в каждом будет своя копия (допустим, метод слишком длинный, чтобы инлайнится в момент вызова)?

Я не претендую на правоту, какие-то утверждения могут быть ложными. Хотел бы узнать, как обстоят дела на самом деле. А также какие подводные камни я ещё не знаю. Разумеется, речь идёт о последних версиях gcc/clang с включённой оптимизацией не ниже -O2.

★★★★★

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

Какая разница из какой древности растут ноги, если проект успешно развивается командой грамотных <подставьте свой язык>?

Дополнено.

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

Дополнено.

Нет. Проекту несколько десятков лет. Начинали они с Лиспа + Си, потом переписали весь лисповый код на Си. Когда-то там был Си++, который был выпилен.

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

И, сдается мне, один из местных анонимов имеет к ней отношение :)

Если ты про меня, то я к Яндексу отношения не имею вообще) Но к подобным вещам — да, имею.

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

Какая разница из какой древности растут ноги

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

Ну вот когда эта СУБД обслужит столько же, сколько обслужил Postgres, тогда и будем посмотреть.

Ну вот когда Postgres будет столь же успешно работать на тех же самых задачах, что и ClickHouse, тогда и можно будет о чем-то говорить.

И да, примеры кода, который на C лучше, чем на C++, будут или вы продолжите лужи газифицировать?

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

Когда-то там был Си++, который был выпилен.

Пруф? Как-то читал их историю, там было написано, что С++ рассматривался, но не был взят т.к. на то время (80-е) еще не было качественных компиляторов.

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

Когда-то там был Си++, который был выпилен.

Это где-то он там был? В самом PostgreSQL или в клиентской либе для него?

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

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

Тогда и не следует говорить про мужиков, которые удумали вдруг «перевод GCC с Си на Си++».

Ну вот когда Postgres будет столь же успешно работать на тех же самых задачах, что и ClickHouse, тогда и можно будет о чем-то говорить.

Ой, да что ты. Что за задачи такие?

И да, примеры кода, который на C лучше, чем на C++, будут или вы продолжите лужи газифицировать?

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

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

Чем спасёт от «эпических абстракций» Си++?

Наличием полного по Тьюрингу обобщенного программирования с мономорфизацией шаблонов и мономорфизируемым же value object. Благодаря которому можно вычислять раскладки данных по памяти, и всё это охватывается оптимизирующим компилятором.

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

Наличием полного по Тьюрингу обобщенного программирования с мономорфизацией шаблонов и мономорфизируемым же value object.

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

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

Что это?

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

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

Тогда и не следует говорить про мужиков, которые удумали вдруг «перевод GCC с Си на Си++».

У вас бинарное мышление? Из моей фразы не следует, что старый код никогда не будет переписан. Следует лишь то, что шансы невелики и без особой причины этого не будут делать. Вот у разработчиков GCC причин накопилось достаточно.

> Ну вот когда Postgres будет столь же успешно работать на тех же самых задачах, что и ClickHouse, тогда и можно будет о чем-то говорить.

Ой, да что ты. Что за задачи такие?

https://habrahabr.ru/company/yandex/blog/303282/ Там была ссылка на тестовые данные. Можете сами попробовать загнать все это в свой любимый Postgres и рассказать про результаты.

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

О как. Да, у меня низкая квалификация, и я вообще уже давно не программист. Тем не менее, с той же конкатенацией здесь было продемонстрировано два решения: одно от царя, которое требует использования либо -std=c++1z, либо расширений GCC, второе мое, низкоквалифицированное, работающее в рамках C++14.

Так что как-то уныло вы слились. «А как дышал, как дышал» (с)

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

У вас бинарное мышление? Из моей фразы не следует, что старый код никогда не будет переписан. Следует лишь то, что шансы невелики и без особой причины этого не будут делать. Вот у разработчиков GCC причин накопилось достаточно.

Как никто и никогда достаточно квалифицированные не будет брать Си++.

https://habrahabr.ru/company/yandex/blog/303282/ Там была ссылка на тестовые данные. Можете сами попробовать загнать все это в свой любимый Postgres и рассказать про результаты.

Открыл статью. Увидел заголовок «Как перестать бояться и начать использовать ClickHouse». Закрыл статью.

О как. Да, у меня низкая квалификация, и я вообще уже давно не программист. Тем не менее, с той же конкатенацией здесь было продемонстрировано два решения: одно от царя, которое требует использования либо -std=c++1z, либо расширений GCC, второе мое, низкоквалифицированное, работающее в рамках C++14.

И оба решения выглядят как убогие костыли. Этот язык попросту не предназначен для метапрограммирования.

Так что как-то уныло вы слились. «А как дышал, как дышал» (с)

Мне это до лампочки.

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

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

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

Что это?

Вот-вот. Ты не в теме, зачем оно вообще в С++.

//Психиатр

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

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

Тем, что писать не надо? Тем, что учить ничего, кроме шаблонной лавировки в цепепе ничего не надо? О, да, аргумент великий. Или чем лучше?

Вот-вот. Ты не в теме, зачем оно вообще в С++.

Так раскрой тему, чтобы было понятно.

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

Как никто и никогда достаточно квалифицированные не будет брать Си++.

Скажите, пожалуйста, те люди, которые делают на C++: GCC/Clang/JVM, Chrome/Firefox/Edge, MySQL/MariaDB, MongoDB/RethinkDB, HHVM/HipHop, Microsoft Office и т.д. — вот они недостаточно квалифицированные?

Открыл статью. Увидел заголовок «Как перестать бояться и начать использовать ClickHouse». Закрыл статью.

И чего вы ждете? Что вам здесь на пальцах все объяснят?

И оба решения выглядят как убогие костыли. Этот язык попросту не предназначен для метапрограммирования.

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

Вот давайте так: вы не хотите показывать код на C и понятно почему. Но может вы тогда на примере реализации PostgresSQL расскажите, где и как это самое метапрограммирование вообще и конкатенация строк в компайл-тайм в частности, помогло бы Postgres-у?

Или вы просто перестали смайлики в тексте ставить дабы за умного сойти?

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

Или чем лучше?

Тем, что шаблонный процессор С++ глубоко интегрирован с другими абстракциями языка. Можно приблизиться к эквивалентному функционалу, создавая DSL над С, но их нужно создавать — та еще работенка. А можно создать DSL над С++, скрывающий обсуждаемые проблемы последнего. И он таки будет намного проще, чем в случае С.

Так раскрой тему, чтобы было понятно.

Тема следующая. Сейчас в БД все гонятся за производительностью аналитики и хотят выжимать из серверов всё по максимуму. На объемах данных больше размера кэша производительность сильно зависит от того, как данные разложены по памяти. А сама раскладка должна минимизировать время выполнения на открытом множестве запросов (не на каком-то одном конкретном запросе). Поэтому внутренняя схема данных (раскладка данных по памяти) не может быть фиксированной. Мономорфные шаблоны С++ позволяют худо-бедно, через ёптвоюмать, но аппроксимировать требуемые раскладки объектами. И всё это хорошо интегрируется (охватывается оптимизатором) с обобщенными алгоритмами, работающими над этими самыми раскладками данных по памяти.

Грубо говоря, там, где у тебя на С будет одна база данных, на С++ потенциально будет 100500, под разные вариации основной задачи. Издержки на поддержание обобщенного кода, безусловно, будут заметно больше таковых для кода заранее специализированного. Зато можно достичь лучшего результата на потоке задач из-за лучшей адаптируемости.

//Психиатр

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

Скажите, пожалуйста, те люди, которые делают на C++: GCC/Clang/JVM, Chrome/Firefox/Edge, MySQL/MariaDB, MongoDB/RethinkDB, HHVM/HipHop, Microsoft Office и т.д. — вот они недостаточно квалифицированные?

Скажи, пожалуйста, у тебя есть в распоряжении хотя бы тысячная часть бюджета какого-либо из этих известных программных продуктов, составляющих каких-нибудь 6 * 10^-10 от общего числа программ? За деньги можно и на брайнфаке программировать.

И чего вы ждете? Что вам здесь на пальцах все объяснят?

Просто не хочу тратить время на ещё одну статью промоутинга.

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

Потому что это нереально.

Вот давайте так: вы не хотите показывать код на C и понятно почему. Но может вы тогда на примере реализации PostgresSQL расскажите, где и как это самое метапрограммирование вообще и конкатенация строк в компайл-тайм в частности, помогло бы Postgres-у?

Так это ты спроси у «психиатра». Это же он говорит, что кресты для СУБД самое оно.

Или вы просто перестали смайлики в тексте ставить дабы за умного сойти?

Нет, по другой причине.

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

И оба решения выглядят как убогие костыли. Этот язык попросту не предназначен для метапрограммирования.

С++ очень хорошо подходит для метапрограммирования там, где требуется его мономорфный by design вариант. По причине того, что других таких языков нет. Есть Rust который как еще посмотреть, лучше он С++ или не особо в плане сбалансированности абстракций. И есть D, который за свою долгую историю только-только вышел из аутсайдеров.

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

Я к чему. Идеальных языков, к сожалению, нет. Что же касается С++, то страшилки, что про него рассказывают, не соответствуют действительности. Всё, что на нем пока еще проблематично делать — это программирование (и метапрограммирование) в большом. Остальное же вполне управляемо.

//Психиатр

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

Тем, что шаблонный процессор С++ глубоко интегрирован с другими абстракциями языка.
Можно приблизиться к эквивалентному функционалу, создавая DSL над С, но их нужно создавать — та еще работенка.

А на шаблонах цепепешных писать не работёнка? Зато (если программист прокачан), написав генератор кода, можно делать вещи, которые на шаблонах делать опухнешь. Даже вон, AnonCxx использовал нестандартную фичу GCC, и код стал хоть как-то более понятным для банальной конкатенации.

Грубо говоря, там, где у тебя на С будет одна база данных, на С++ потенциально будет 100500, под разные вариации основной задачи. Издержки на поддержание обобщенного кода, безусловно, будут заметно больше таковых для кода заранее специализированного. Зато можно достичь лучшего результата на потоке задач из-за лучшей адаптируемости.

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

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

А на шаблонах цепепешных писать не работёнка?

Это как посмотреть. Вообще — нет. Они не такие страшные, как рассказывают. Просто очень многословные, особенно относительно языков, прямо заточенных под обобщенное программирование. И уже не такие низкоуровневые, как раньше (С++03). Кроме того, есть вполне себе хорошие библиотеки метапрограмм.

Если же делать свой препроцессор над С, то по началу он будет казаться проще, но по мере усложнения требований этот препроцессор по сложности начнет приближаться к компилятору С++ и становиться чемоданом без ручки.

Слов много, смысла мало. В общем, ты понял.

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

Как я сказал, я к Яндексу и его БД отношения никакого не имею, но таки в этой области работаю.

//Психиатр

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

Мономорфные шаблоны С++ позволяют худо-бедно, через ёптвоюмать, но аппроксимировать требуемые раскладки объектами

Есть где-нибудь в открытом доступе примеры этого?

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

Кроме того, есть вполне себе хорошие библиотеки метапрограмм.

Осталось только упомянуть Hana или Spirit, чтобы я тебя понял окончательно :-)

Если же делать свой препроцессор над С, то по началу он будет казаться проще, но по мере усложнения требований этот препроцессор по сложности начнет приближаться к компилятору С++ и становиться чемоданом без ручки.

Не будет, если не выкручивать себе руки типами.

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

Да, верно. Я просто не понимаю реальную выгоду.

Как я сказал, я к Яндексу и его БД отношения никакого не имею, но таки в этой области работаю.

SciDB?

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

Не будет, если не выкручивать себе руки типами.

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

Да, верно. Я просто не понимаю реальную выгоду.

Выгода проявляется на потоке задач. Обработка данных — это очень динамичная и довольно высоко-конкурентная область. Тут тоже нужно уметь что-то типа «быстро прототипировать». С++ сложен, многословен, плохо предсказуем, но с задачами, в целом, справляется. Хотя стоны боли мозга при этом идут по всему Интеренту.

SciDB?

Неа, не пытайся. А то деанонимизируешь меня))

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

Команда квалифицированных специалистов, которая хорошо знает и Си и Си++ для решения поставленной задачи никогда не возьмёт Си++

Надо же, а мужики из GCC взяли и переехали с С на С++, во дураки.

Команда gcc перешла на C++, по причине того, что произошла обычная смена поколений программистов. Причина до смехоты проста, удельный вес тел пишущих на C++ перевалил удельный вес тел «старых пердунов». Погроммист привыкший к классам никогда не освоит структурный метод. Так и новое поколение «приобщённых к C++» не смогут писать код на классическом Си.

Для разработки компиляторов, идеален структурный метод представленный ныне такими языками как Си и Оберон. Ну а, что касается разработки ядра, то Линус по этому поводу сказал своё авторитетное мнение. Так, что те кто хвалит C++ пусть завалят свои «хлебальники» и сидят смирно по лавочкам.

Так для справки добавлю, что первый так называемый «GNU C Compiller» был написан на Паскале.

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

Есть где-нибудь в открытом доступе примеры этого?

Вообще есть, но я сейчас не хочу сейчас деанонимизироваться. Подожди немного.

//Психиатр

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

Скажи, пожалуйста

Не скажу, и не пожалуйста. Вам был задан конкретный вопрос: эти люди некомпетентны?

Потому что это нереально.

Можно и так сказать. Не суть важно. Метапрограммирование в C++ — это некая случайно получившаяся нашлепка сбоку. Применяется там, где уместно, но таких мест мало.

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

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

Для разработки компиляторов, идеален структурный метод представленный ныне такими языками как Си и Оберон.

Да-да-да. Расскажите это функциональщикам, приверженцам Haskell-я, OCaml-а, Scala и т.п. Они поржут.

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

Так для справки добавлю, что первый так называемый «GNU C Compiller» был написан на Паскале.

Не был. Это распространенный миф.

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

Грубо говоря, там, где у тебя на С будет одна база данных, на С++ потенциально будет 100500, под разные вариации основной задачи.

Чё? Раскрой тему. С минимальными примерами.

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

У них тут цель довольно узкая — SIMD-специфичные раскладки данных по памяти, но идея та самая, да.

Какая ещё нахрен ракладка - это кастыль для лсных макак.

Т.е. макаке из point{x, y, z}[] - делают point{x[], y[], z[]}, чтобы амёбка могла это юзать как обычные поинты.

Зачем тут нужны кресты? Правильно - низачем. Зачем тут нужен интел? Правильно - низачем. Героическое решение проблемы вызванной терминальной лсностью адептов.

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

Не скажу, и не пожалуйста. Вам был задан конкретный вопрос: эти люди некомпетентны?

Не знаю.

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

А зачем тогда Си++ в тех задачах, с которыми с тем же успехом справился Си?

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

Не знаю.

Тогда как вы собираетесь доказывать свой тезис «Как никто и никогда достаточно квалифицированные не будет брать Си++.»? Или вам достаточно было всего лишь пёрднуть в лужу?

А зачем тогда Си++ в тех задачах, с которыми с тем же успехом справился Си?

Да вот не видно, чтобы с таким уж успехом. Старые проекты, которые дорого переписывать — да, живут на C. Старые библиотеки, которые используются из других языков — да, живут. Мелкие вставки для динамических ЯП (вроде Ruby или Erlang) — да, живут. Но вот так, чтобы большой проект начали делать полностью на C... Примеры у вас есть?

Если не брать нишу embedded-а и ядра Linux/FreeBSD, то разработка на C будет обходиться, минимум, в 1.5-2 раза дороже. Потому, что там, где на C++ достаточно написать:

rapidjson::Document document;
document.parse(input);
return document["connectionString"].GetString();
На C придется делать что-то вроде:
int result = -1;
json_document * doc = json_create_document();
if(!doc)
  goto cleanup;
result = json_parse_input(json_document, input);
if(result == -1)
  goto cleanup;
result = -1;
json_value * value = json_find_element(json_document, "connectionString");
if(!value)
  goto cleanup;
if(JSON_VALUE_TYPE_STRING != json_value->type)
  goto cleanup;
char * connstring = malloc(strlen(json_value->data) + 1);
if(!connstring)
  goto cleanup;
strcpy(connstring, json_value->data);
*output = connstring;
result = 0;

cleanup:
  if(json_document)
    json_destroy_document(json_document);

return result;

eao197 ★★★★★
()

Тут в обсуждении всплывала тема использования C++ в Windows. На reddit-е в одном из обсуждений появился вот такой ответ: https://www.reddit.com/r/cpp/comments/4oruo1/windows_10_coded_in_c_or_assembl...

Суть:

Kernel proper - This is mostly written in C. Things like the memory manager, object manager, etc. are mostly written in C. The boot loaders are written in ASM, but set up a C environment rather quickly.

Drivers - that said, a lot of newer kernel mode drivers are actually written in C++ (however, its style is more akin to «C with classes». Lower level code has been much slower to adopting anything past C++98)

User land - Mostly C++ with varying levels of quality and version compliance. If it's a pre-Windows 8.0 component, it was written against mostly C++98. More recent features are C++14 and better.

Плюс в последних версиях Windows многое делается на современном C++ (14/17) и C#.

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

Тогда как вы собираетесь доказывать свой тезис «Как никто и никогда достаточно квалифицированные не будет брать Си++.»?

Доказывается очень просто :-) Либо программист разбирается с тем, как работает машина, как управлять её ресурсами - и для этого изучается Си, а программист становится квалифицированным, ибо он знает как реально работают его строки, массивы, как выделяется память, когда пишет на Си :-) Либо изучается Си++ с его 1300 страницами стандарта, тоннами книжек про то, как надо, а как не надо и т.д., на что уходит огромное количество времени :-) При этом, начать писать на Си++ после многолетней борьбы с ним можно, но квалификации и просветления это не приносит, а становится лишь понятным, как надо программировать на Си++ :-) Можно стать мастером Си++, потратив декаду своей жизни, и ничего не узнать про то, как реально всё работает :-) В Си так не получится :-)

Или вам достаточно было всего лишь пёрднуть в лужу?

Запомни, весь твой пафос - ничто :-)

Если не брать нишу embedded-а и ядра Linux/FreeBSD, то разработка на C будет обходиться, минимум, в 1.5-2 раза дороже. Потому, что там, где на C++ достаточно написать:
На C придется делать что-то вроде:

Весь представленный выше сахарный Си++-код вызывает на деле тонны кода как на Си++, так и на Си :-) А представленный код на Си можно завернуть в 1-2 кулл-функции и показывать коллегам, как всё коротко и ясно :-)

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

При этом, начать писать на Си++ после многолетней борьбы с ним можно, но квалификации и просветления это не приносит, а становится лишь понятным, как надо программировать на Си++ :-)

Можете показать на примерах, что именно в C++ требует многолетней борьбы?

А представленный код на Си можно завернуть в 1-2 кулл-функции и показывать коллегам, как всё коротко и ясно :-)

Можете показать, как будет выглядеть этот велосипед?

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

Можете показать на примерах, что именно в C++ требует многолетней борьбы?

Любой раздел в Си++ возьми, у новичка от него голова кругом пойдёт. А разделов очень много. А уж тонкостей и нюансов... А уж всяких приёмчиков, методик, паттернов... Чтобы это уложить с своей голове нужно много практики, а это борьба на долгие годы :-) Неспроста же большинство работодателей выкатывают требование для Си++-программистов - наличие опыта на Си++ от 5 лет.

Можете показать, как будет выглядеть этот велосипед?

Я не знаю, что там делает RapidJson в своих квадратных скобочках, никогда с ним дело не имел. Но суть, как я понял, найти некий элемент по имени в неком JSON-вводе? Пожалуйста:

return json_parse_input_get_string(input, "connectionString");

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

Любой раздел в Си++ возьми,

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

return json_parse_input_get_string(input, «connectionString»);

Прекрасно. Просто прекрасно. Для одного частного случая вы написали целую функцию, которая возвращает что?

Если вам потом потребуется сделать что-то похожее, но с целью извлечь целочисленный «defaultPort», вы скопипастите содержимое своей json_parse_input_get_string в json_parse_input_get_ushort?

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

Конкретнее, пожалуйста.

Любой раздел. Хоть стримы, хоть шаблоны с инстанцированием и специализацией, хоть абстрактные классы и классовые иерархии, хоть исключения, хоть пространства имён, хоть перегрузки, хоть STL... Море разделов. Мне много раз доводилось слышать, что основную книгу Страуструпа про Си++ новичкам не рекомендуют. Даже сам Страуструп выпустил другую толстенную книгу, кажется, «Программирование принципы и практика использования Си++», адресованную новичкам. Для разминки, так сказать. А ты дай новичку почитать TC++PL. Посмотри, сколько времени займёт его знакомство с Си++. Кстати, я вообще с неё и начинал :-)

Прекрасно. Просто прекрасно. Для одного частного случая вы написали целую функцию, которая возвращает что?

Да. Я тебе больше скажу. Любой проект или стартап - это частный случай. Генератора уникальных программных продуктов не бывает. Бывают генераторы бложиков или сайтов-визиток, или CMS, но генераторов ЛОРа не бывает. Жизненный цикл любого серьёзного продукта или системы измеряется десятками лет. При этом такой продукт или система является частным случаем. Поэтому в таком проекте мне не зазорно написать функцию, решающую конкретную задачу.

Если вам потом потребуется сделать что-то похожее, но с целью извлечь целочисленный «defaultPort», вы скопипастите содержимое своей json_parse_input_get_string в json_parse_input_get_ushort?

А то ты не знаешь, что существуют приёмы декомпозиции и выделения общего кода в отдельную функцию :-) Хватит прикидываться.

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

Вас 1 или 2 человека? :-)

Больше, но разве это как-то меняет тот факт, что ты занимаешься клоунадой (в лучшем случае, если ты не совсем идиот)?

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

Больше, но разве это как-то меняет тот факт, что ты занимаешься клоунадой (в лучшем случае, если ты не совсем идиот)?

Да, но так можно сказать и применительно к стартапу :-)

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

Да, но так можно сказать и применительно к стартапу :-)

Сказать можно вообще что угодно. Ты этим и занимаешься.

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

Сказать можно вообще что угодно. Ты этим и занимаешься.

Ну покажи стартап тогда :-) Давай его оценим :-)

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

Любой раздел.

Еще раз: что именно вам не понятно?

Мне вот приходилось учить людей C++ и как раз по книге Страуструпа TC++PL. Процесс нормальный, т.к. те, кто может программировать, делится на две категории: понимающие указатели и не понимающие указатели. Те, кто понимает указатели, осваивает C++ нормально. Те, что не понимаю, не могут и в обычный C.

Да.

Ок. Так что ваша функция возвращает? Указатель на динамически сформированную строку?

А то ты не знаешь, что существуют приёмы декомпозиции и выделения общего кода в отдельную функцию

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

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

Ну покажи стартап тогда :-) Давай его оценим :-)

Выслал тебе на почту. Вместе со всем кодом и документацией.

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

Еще раз: что именно вам не понятно?

Мне понятно всё из вышеперечисленного. Только хардкорно метапрограммировать шаблоны на Си++ не приходилось. Но на это понимание было затрачено масса времени. Непомерное количество.

Ок. Так что ваша функция возвращает? Указатель на динамически сформированную строку?

Указатель на какой-нибудь struct String в куче.

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

Никакой копипасты не будет. Будет либо 3 функции, одна общая, две для конкретных случаев, либо макрос.

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