LINUX.ORG.RU

Написал небольшую книгу для C/C++ программистов

 , , , ,


13

8

Здравствуйте. Меня зовут Андрей Карпов. Сфера моих интересов - язык C/C++ и продвижение методологии статического анализа кода. На протяжении пяти лет я являюсь Microsoft MVP в номинации Visual C++. Основная цель моих статей и работы, сделать код программ немножко безопасней и качественней. Буду рад, если эта мини-книга научит вас писать более надежный код и предостережет от некоторых типовых ошибок. Немало полезного здесь можно будет почерпнуть и тем, кто занимается написанием стандартов кодирования для своих компаний.

Немного истории. Не так давно я создал ресурс, на котором делился различными полезными советами по программированию на языке С++. Ресурс не собрал ожидаемое количество подписчиков, поэтому я не вижу смысла приводить здесь на него ссылку. Сайт просуществует какое-то время, после чего уйдет в небытие. А вот советы достойны сохранения. Поэтому я доработал, пополнил эти советы и объединил их в единый текст. Желаю приятного чтения.

UPD: PDF-версия: https://yadi.sk/i/RCHauHFBr2cSs

P.S. Пользуясь случаем приглашаю всех желающих последовать за мной в Twitter: @Code_Analysis.

>>> Главный вопрос программирования, рефакторинга и всего такого

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

> На протяжении пяти лет я являюсь Microsoft MVP в номинации Visual C++

Товарищи, которые шарят в этих делах, стоит уже кричать ВАУ!? Этот самый MVP, что это такое? Master Visual Plus?

Первый коммент и сразу в точку :-) ..

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

Питон и Руби используются даже в системном софте вроде менеджера пакетов в Генте/Федоре/Сусе (не последние дистрибутивы).

Не стоило вам про это упоминать. В связи с выбором python'а огребли кучу проблем.

Ну да, ну да. Потом переписали на Си++ и... лучше не стало.

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

Вы перечислили 5 прог (я сомневаюсь что весь гном на vala) не на C/C++, которые как раз и входят в описанные мной 5%. Дальше что?

Я не говорю что на других языках не пишут, и не говорю что C++ прекрасен (он говно), но факт остаётся фактом - альтернатив у C++ нет.

Но если вы вылезете из мирка вашего локалхоста

Вылажу и вижу тонны серверов, DB и прочего на C/C++. И?

И оно работает ничуть не хуже, чем написанное на Си++.

Тут бы тесты привести.

Еще раз повторяю - языка быстрее C/C++ нет. Если нужна производительность, приходится писать на том УГ что есть.

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

Ну да, ну да. Потом переписали на Си++ и... лучше не стало.

Во первых еще не переписали. Только первый этап провели. Во вторых уже стало.

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

нет, сам по себе с/c++ - это язык, скорость, производительность определяется компилятором. Просто в силу своей неполноты позволяет быстрее впаривать клиенту с виду годный товар.

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

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

Это вы о «языках выского уровня»? Удачно у вас получилось.

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

Ситуация интересна тем, что ... привлекает особую породу людей

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

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

Я склонен раздавать. Есть компании в которых способность написания ХэллоуВорлд на С - это проходной критерий на джуна, а пузырьковая сортировка - на сеньйора. Естественно после их кода рассуждения топик-стартера - просто мед для души

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

Ну да, ну да. Потом переписали на Си++ и... лучше не стало.

Во первых еще не переписали.

Paludis.

Только первый этап провели. Во вторых уже стало.

Yum? Ну так учли опыт.

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

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

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

Еще раз повторяю - языка быстрее C/C++ нет.

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

Си и Си++ --- это, как известно, 4.5 разных языка (ну или 3.5, зависит от того, как считать). Касательно быстроты: в первую очередь производительность в больших проектах связана с gcc и его оптимизациями. Если вы возьмёте, например, Фортран, Д, Го и скомпилируете их код gfrotran/gdc/gccgo, получите очень близкий результат. Если учесть, что именно C и C++ фронтэнды в первую очередь подвергаются оптимизации, окажется, что разница эта вообще не значима. Так, у Интела компилятор Фортрана в большинстве тестов с интенсивными операциями над большими массивами выигрывает у компилятора Си, иногда разница достигает десятков процентов. MLton на больших проектах за счёт глобальной оптимизации практически всегда быстрее Си++, причём часто разница оказывается угрожающе велика. Паскаль во многих тестах демонстрирует меньшие требования к ОЗУ, нежели даже Си, если это конечно, не Хелловорд. Обжектив-Си используется как системный язык на Яббле и вполне справляется с этою функцией не хуже Си++, а старые версии МакОСа вообще были на специальном диалекте Паскаля написаны и ими пользовались.

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

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

Этот самый MVP, что это такое?

Форумный звездобол, который назвиздел таких объёмов, что всплыл в гугле статистике и его лайкнул кто-то из штата мелкософта. «Работа с сообществом» в их понимании.

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

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

Я даже не знаю что сказать на этот бред.

По вашей логике, C++ код, собранный не gcc будет медленнее JS? Так?

Вы хоть один проект написали на C++? Вы вообще представляете себе, что это за язык?

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

Так в чем эта «книга» техническая? По каким признакам? Формул нет, один структурированный текст. pdf и тем более «как есть» не очень удобно для электронных книг.

Displacer ★★ ()

17 пример и все те же грабли. Но в данном случае решение проблемы в лучших традициях мелкософта - костыль. У нас проблема в компиляторе? Так давайте введем новую функцию! Для GCC лучше явно указать компилятору что именно ему нужно делать:

#pragma optimize("-no-dead-code-removal")
memset(x, 0, sizeof(x));
#pragma optimize("-dead-code-removal")
Потому что проблемы компилятора должны решаться за счет компилятора а не введением новых сущностей.

A-234 ★★★★★ ()
Последнее исправление: A-234 (всего исправлений: 1)
Ответ на: комментарий от Vudod

Мой результат (gcc, 10^9 вызовов):
Без цикла:

-O0: 11.9s
-O1: 3.8s
-O2: 4.1s
-O3: 1s

С циклом:

-O0: 24.8s
-O1: 8.2s
-O2: 5.4s
-O3: 0.3s
Итого: с самым ширпотребным -O2 результаты практически идентичны.

x-signal ()
Ответ на: комментарий от x-signal

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

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

Со странными компаниями ты общаешься.. =)
Хотя я не фанат писать код на интервью.

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

Вот не передёргивайте. Коли аргументы закончились, помолчите. Ни разу я не утверждал, что JS может быть быстрее Си++. Там сплошь фигурировали компилируемые в машинный код языки. И да, если вы не в курсе, что производительность компилируемой программы сильно (бывает, что и в разы) зависит от компилятора, то грош вам цена, как программисту. Кстати, чисто теоретически JS может быть быстрее Си++, потому что там есть виртуальная машина и JIT оптимизация, могущая на динамической памяти быть эффективнее обычной компиляции. Есть даже вполне реальные куски кода, где Ява за счёт JIT выигрывает у Си++ (на прогретой машине, естественно).

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

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

Вот не передёргивайте.

Касательно быстроты: в первую очередь производительность в больших проектах связана с gcc и его оптимизациями.

Вы прямым текстом заявляете, что производительность C++ - заслуга компилятора, а не языка/программиста.

чисто теоретически JS может быть быстрее Си++

Конечно может. Только в 99% случаев он в разы медленнее. Если вебмакака копирует объекты по 100500 раз, переливая из пустого в порожнее, то никакой компилятор/транслятор/VM тут не поможет.

Слепая фанатичная вера, что сделать ничего быстрее или столь же быстрого

«Слепая фанатичная вера» - это ваша ненависть к C++.

Если у языка A прямая работа с памятью, а у языка B через прослойки, VM, GC и прочее - то ясное дело, что язык A в выигрышной позиции, с точки зрения возможных оптимизаций. Но это не мешает писать быдлокод на языке A, который будет медленнее языка B.

RazrFalcon ★★★ ()

Обновил PDF на Яндекс диске (исправлены разные ошибки) и теперь новая правильная ссылка: https://yadi.sk/i/RCHauHFBr2cSs

Прошу поправить в топике. Или дать права мне самому править.

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

NDA

Т.е. получается что у вас нет опыта и вы заявляете о непригодности библиотек? Расскажите, пожалуйста, как у вас в этих мифических NDA проектах было со статической сборкой? Оно вам там не мешало случаем?

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

А программерский опыт, по моему, не с возрастом наживается, а с практикой.

А для практики нужно время. И не нужно пытаться передергивать.

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

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

Я бы вас попросил =)

В бытность ТОЛЬКО админом «назвёздывал» на хороший роман с продолжением, но чота никто из МС так и не лайкнул =)

Сейчас обязанностей стало в разы больше, появились другие интересы, «звездение» отошло на другой план.

По сабжу: напоминает маркетинг продуктов МС.

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

программерский опыт, по моему, не с возрастом наживается, а с практикой.

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

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

Или как тут делается....

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

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

Что толку тестировать и использовать, если там индексы перепутаны?

Вы не думали, что до конкретной ситуации a[5] != b[5] тесты могли просто не дойти. Никто не спорит, что код некорректен, но может быть в реальной жизни, он _ни разу_ не выполнялся. Да и вы говорите таким тоном:

Гнать тогда надо программистов

будто эта ошибка говорит квалификацию программиста, хотя это не так. Это максимум – о невнимательности. Человек не робот, и ему свойственно ошибаться. Вы главное следите, чтобы сами, в коде своего проекта такую очепятку не допустили xD

znenyegvkby ()

Мндэ... Просмотрел тред. В который раз убеждаюсь в справедливости утверждения: «Мировой разум - константа, а население растет...»

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

Вот и скажите мне спасибо. Благодаря мне мир стал чуть лучше.

А с чего, собственно, вы решили, что эта функция была переписана _именно благодаря вашей проверке_? xD

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

Кстати у PWS сотни предупреждений, не было желания собрать реальные примеры для каждого случая?

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

Для практики нужно желание и стремление к саморазвитию, прежде всего. Время найдется.

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

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

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

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

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

Тогда, скорее всего, спасибо вам xD

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

Кстати у PWS сотни предупреждений, не было желания собрать реальные примеры для каждого случая?

Конечно есть. Смотрите левый верхний угол на нашем сайте. Сейчас в базе 9574 ошибок.

Andrey_Karpov_2009 ()

Почитал тред. Поржал.

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

Rust пока не дорос и не умеет компилироваться на большинстве платформ, да и не замена он С++, ибо не ООП, а фактически функциональщина. Вобщем-то как и Го. То что на С++ делается элегантно и читаемо, на обоих этих заставляет вытекать глаза.

На ассемблере писать весело, но проблема с выбором всегда мучает. х86 асм уныл чуть более чем полностью, а, к примеру, м68к асм почему-то не работает на х86...

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

Q-Master ()

топик не читал, где рабочая ссылка блеать?

iddqd ()

После внедрения баша в Швиндовс 10 Сливная, MS выдала команду армии зомби атаковать онтопик сайты?

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

С++ 14 были введены функции stl типа emplace_back ... до этого размотка конструкторов
наконец то додумались до семантики перемещения и rvalue
о этого тупа тратили процессорное время на конструктора копирования, перемещения и т.д.
насколько я понял в rust и Go это проблема решена.

Понял ты так себе.

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

ты(ок) ведь в курсе что хирургов врачами достаточно недавно стали считать?

практика всяко важна в 2 смыслах.

1. эксперементальная для накопления данных для последующей теории.

2. учебная когда знание переданные подкрепляются.

зы. когда же всё перешло на рефлексы - там не важно сколько лет практики - важно что всё(т.е. чем большее вот это «всё» тем опытнее) на рефлексах.

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

И ссылки на вконтактик тут тоже не любят.

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

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

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

https://github.com/python/cpython/blob/1fe0fd9feb6a4472a9a1b186502eb9c0b23663... вот кстати еще один примерчик, вручную раскученный двоичный поиск через if-ы

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

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

Я тебя убью. И меня в любом суде оправдают.

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

Я тебя убью. И меня в любом суде оправдают.

Что это с вами? Отчего бомбануло? xD

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