Является ли современный С++ более распространенным?

Когда я впервые изучил С++ 6-7 лет назад, то, что я узнал, было в основном "C с классами". std::vector была определенно передовой темой, о чем вы могли бы узнать, если хотите. И, конечно, никто не сказал мне, что деструкторы могут быть использованы для управления памятью.  Сегодня, везде я смотрю, я вижу RAII и SFINAE и STL и Boost и, ну, Modern С++. Даже люди, которые только начинают работать с языком, как представляется, учат этим понятиям почти со дня 1.

Мой вопрос в том, что это просто потому, что я вижу только "лучшее", то есть вопросы здесь, на SO, и на других сайтах программирования, которые, как правило, привлекают новичков (gamedev.net), или это на самом деле представитель сообщества С++ в целом?

Является ли современный С++ действительно стандартным? Эксперты пишут о том, что это "способ, которым С++ просто"? Или я просто не могу увидеть тысячи людей, которые все еще изучают "C с классами" и записывают свои собственные динамические массивы вместо использования std::vector, а также осуществляют управление памятью, вручную вызывая новое/удаление из своего кода верхнего уровня?

Насколько я хочу верить в это, кажется невероятным, если сообщество С++ в целом так развилось в течение нескольких лет. Каковы ваши впечатления и впечатления?

(отказ от ответственности: кто-то, не знакомый с С++, может неправильно истолковать заголовок, спрашивая, набирает ли С++ популярность по сравнению с другими языками. Это не мой вопрос. "Современный С++" - это общее имя для диалекта или стиля программирования в С++, названный в честь книга " Современный дизайн С++: общие шаблоны программирования и дизайна, примененные", и меня это интересует исключительно против старого С++. нужно сказать мне, что время С++ прошло, и мы все должны использовать Python;))

Ответ 1

Здесь, как я думаю, все сложилось.

Первым поколением программистов на С++ были программисты C, которые на самом деле использовали С++ как C с классами. Кроме того, STL еще не был на месте, так что С++ по существу был.

Когда вышел STL, эти продвинутые вещи, но большинство людей, которые пишут книги, собирают учебные планы и учебные классы, сначала научились C, а затем дополнительным материалам на С++, поэтому второе поколение узнало об этом. Как еще один ответ отметил, что если вам удобно писать регулярные циклы, переход на использование for_each не покупает вас много, кроме теплого нечеткого чувства, что вы делаете вещи "современным" способом.

Теперь у нас есть инструкторы и авторы книг, которые используют весь С++, и получают их инструкции с этой точки зрения, такие как Koenig и Moo Accelerated С++ и новый учебник Stroustrup. Поэтому мы не изучаем char * then std:: strings.

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

Ответ 2

Абсолютно да. Для меня, если вы не программируете С++ в этом стиле "Modern С++", как вы термине, тогда нет смысла использовать С++! Вы могли бы просто использовать C. "Современный С++" должен быть единственным способом программирования на С++, на мой взгляд, и я ожидал бы, что все, кто использует С++ и запрограммированные в этом "Модерн", согласятся со мной. На самом деле, я всегда полностью потрясен, когда слышу о программиста на С++, который не знает о таких вещах, как auto_ptr или ptr_vector. Насколько мне известно, эти идеи являются базовыми и фундаментальными для С++, и поэтому я не мог представить это каким-либо другим способом.

Ответ 3

В дни Windows 3.1 C был стандартом. Когда С++ попал на рынок разработчиков, а затем стал стандартом ANSI, это была новая жара. Он популяризировал акроним ООП и некоторые основные шаблоны проектирования с использованием полиморфизма.

Теперь, с большей поддержкой управляемых платформ с низким барьером для входа, например С#/. NET, меньше причин использовать С++. Так что большая часть базы разработчиков будет иметь выбор и пусть будет честно: С++ - это медведь, чтобы учиться новичку. С помощью С# вы можете просто запустить с ним.

Это оставляет действительно только платформы, которым NEED С++ и гибким С++ евангелистам продолжать заниматься искусством. Это сообщество, которое нуждается и хочет, чтобы все слои абстракции считались "Modern С++".

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

Ответ 4

Я один из тех ребят, которые научились работать с STL и много слышали о RAII и хороших инструментах программирования на С++ с первого дня. Похоже, некоторые из самых рекомендуемых книг для изучения С++ сегодня (например, Accelerated С++ и Эффективные серии С++) сосредоточиться на использовании инструментов STL вместо того, чтобы сворачивать ваши собственные вещи, а также давать множество "правил" для эффективного (или "современного" ) программирования.

Но разговаривая с друзьями, я также отметил, что некоторые компании по-прежнему работают с "C с классами", а не с "Modern С++". Возможно, культура, предложенная авторами и пользователями "Modern С++", когда-нибудь будет преобладать:)

Ответ 5

Я думаю, что у вас только что начался плохой опыт.

Вам нужно получить Scott Meyers Эффективные книги на С++. Я начал с С++ в гневе в 1999 году, моя команда привела меня к сидению и прочитала "Эффективный С++" и "Эффективный С++", прежде чем мне разрешили проверять ЛЮБОЙ код.

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

Если вы последуете его совету, вы напишите хороший или "Современный" С++.

У него теперь есть книга о STL, но я не читал.

Ответ 6

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

Я изучил С++ изначально как нечто вроде C с классами; хотя язык продвигался далеко за пределы этого, книги, которые я читал, и люди, с которыми я работал, были твердо застряли на "старом С++". RAII, о чем люди подумают, а не автоматически, и я помню, как читал некоторые из ранних статей о проблемах безопасности исключений.

Как уже отмечалось, сейчас появляются новые книги. Многие из старых по-прежнему актуальны, но они все чаще кажутся полными объяснений, почему плохие идеи плохи. (Точно так же для современных читателей трудно понять, насколько революционными были идеи Фрейда бессознательного, поскольку теперь это общепринятая мудрость.)

Stroustrup только что вышел с учебником "Программирование: принципы и практика с использованием С++". Я купил его, потому что еще не успел выучить хороший материал из книги Страустрапа, но не прошел мимо первых нескольких глав. Пока что все, что я могу сказать, это то, что я одобряю то, как он начинает, и это, по крайней мере, хорошее введение в то, как С++ следует использовать.

Ответ 7

Во время работы над проектом, в котором я сейчас участвую, существует много кода на С++, который развился в течение значительного периода времени (более 10 лет). Эволюция, о которой вы говорите, хорошо видна там: более старый код часто "C с классами" - исходные указатели, строки char* и использование связанных функций C, массивов и т.д.; более новый код использует интеллектуальные указатели ATL и, таким образом, управляет ресурсами, но большую часть времени он все еще придерживается ручных кодированных петель, а итератор - редкое зрелище; а новейший - контейнеры STL, алгоритмы, shared_ptr (включая пользовательские удалители для управления дескрипторами и т.д.), сильно обобщенные функции и шаблоны классов и т.д. Большинство традиционных методов кодирования "C с классами", таких как необработанные неинкапсулированные указатели с ручным управлением продолжительностью жизни, в наши дни очень сомневаются в обзорах кода. Судя по этому, кажется, что ваше наблюдение является точным.

Самая последняя разработка, похоже, является причудой для С++ 0x lambdas, которая имеет положительную сторону в том, что она также снижает баланс в пользу использования стандартных алгоритмов по сравнению с ручками с ручным кодированием, так как теперь вы можете иметь все свои код inline с алгоритмами.

Ответ 8

По моему опыту это сильно зависит от возраста программного продукта/проекта. Большинство новых проектов, о которых я знаю, используют современные С++ (RAII, STL, Boost). Тем не менее, существует много проектов на C++, которым больше 10 лет, и вы не видите там современного С++.

Кроме того, имейте в виду, что некоторые из самых популярных реализаций STL были в значительной степени сломанными до 5 лет назад (MSVC < 7.0 и GNU < 3,00)

Ответ 9

Я бы не сказал, что std::vector в наши дни квалифицируется как "современный". Это действительно просто.

Вообще-то мое впечатление заключается в том, что люди приобрели некоторый опыт работы с современным стилем С++ и немного протрезрели. Просто, чтобы взять простой пример, STL for_each был интересен, но на практике он не добавляет ужасную массу значения в простой цикл C. Сложнее отлаживать и иногда не обеспечивает лучшую производительность. Кроме того, конструкции для функционального программирования в текущем STL, как правило, очень громоздки, особенно если вы получили опыт от реального функционального языка, такого как ML.

Ответ 10

По моему опыту (испанский университет), к сожалению, норма должна состоять в том, чтобы не рассматривать языки сами по себе. Они используют самые простые языки для обучения программированию (т.е. Java), потому что это должно быть легко для учителей и учеников, а затем они используют C для классов ОС и т.д.

С++ вводится очень немного (во всяком случае, в любом курсе), просто для того, чтобы предоставить классы C. Они не получают толчок или даже STL. Я думаю, что поддерживать все характеристики и образ мыслей на С++ является дорогостоящим как для учителей, так и для студентов. Сколько из программистов на С++ знают достаточно всех библиотек Boost, чтобы использовать их для лучшего решения или для его разработки? Нужно проявлять интерес к поддержанию всех новых библиотек и идиом.

Однако, как я уже сказал, кажется, что программирование в целом (и, в частности, языки программирования) не воспринимается слишком серьезно, поскольку, похоже, это временное задание, когда они начинают работу, а затем забывают, как программировать, когда они идут в дереве предприятия. Многие предприятия здесь и сам университет чувствуют, что программирование может быть сделано кем угодно.

Если вы следуете этой философии, то для большинства людей, которых я знаю, С++ всегда будет "C с классами".

Привет,

Ответ 11

Я думаю, что самый большой барьер, с которым я столкнулся, - это поддержка инструментальных средств, особенно в кросс-платформенных проектах. До того, как несколько лет назад было общепринято замечать примечания к сборке, в которых говорится, что "платформа x нуждается в STLport для работы, потому что их компилятор запутан". Даже сейчас я вижу проблемы с людьми, пытающимися использовать несколько сторонних зависимостей, привязанных к разным версиям BOOST. Это делает невозможным связывание, то есть вам нужно вернуться и восстановить свои отпечатки с нуля.

Теперь, когда почти все перестали использовать MSVС++ 6, беспорядок STLport позади. Но как только TR1 выйдет за дверь, мы вернемся к "тем вариантам, в которых среды поддерживают его, и правильно их исправить", и это еще раз замедлит принятие.

Я работаю над проектом, начатым на C (не С++) в 1992 году. Развертывание современных методов в устаревшей кодовой базе было бы невозможно. Аналогично, я работаю над другим проектом, который намного ближе к передовой части языка С++.

Ответ 12

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

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

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

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

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

Ответ 13

Прежде чем ответить на такой вопрос, вам придется договориться о том, что такое "Модерн". Это вряд ли произойдет, поскольку "Модерн" - это плохо определенное слово и означает разные вещи для разных людей. Название книги Александреску (Modern С++ Design) на самом деле не помогает, так как это в основном книга по шаблону Metaprogramming, которая является определенной областью С++, но ни в коем случае не единственной.

Для меня "Modern С++"!= "Метапрограммирование шаблонов". Я бы сказал, что функции С++ поверх C будут попадать в эти категории:

  • Классы (конструкторы, деструкторы, RAII, динамическое литье и RTTI)
  • Исключения
  • Ссылки
  • Структуры данных и алгоритмы в стандартной библиотеке (STL)
  • iostreams
  • Простые шаблоны классов и функций
  • Метапрограммирование шаблонов

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

Метапрограммирование шаблонов.

Короткий ответ на метапрограммирование шаблона - это просто сказать "нет". К сожалению, для некоторых людей это является синонимом "Современное программирование на C++" из-за книги, но в итоге оно создает больше проблем, чем решает. Если С++ не разработает более общие общие механизмы программирования, такие как отражение, он будет плохо подходит для общего программирования, а языки более высокого уровня, такие как Python, будут лучше подходят для этих случаев использования. Для этого и многих других причин см. С++ FQA

Ответ 14

Лучшая книга для изучения С++. "Ускоренный С++" Кенига и Му, учит тому, что вы описываете как современный С++, поэтому я думаю, что большинство людей в наши дни используют его. Для тех из нас, кто долгое время использовал С++ (с середины 80-х годов в моем случае), современный С++ - это большое облегчение от утомительных задач написания наших собственных массивов, строк, хеш-таблиц (повторение рекламной тошноты).

Ответ 15

Я посмотрел на С++ Jobs на самом деле, а "современные" библиотеки все чаще используются в описаниях заданий, MFC, "old-style" библиотека С++ менее используется.

Ответ 16

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

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

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

У STL есть свои плюсы и минусы, но он пережил испытание временем, если вы хотите что-то, что работает и которое просто STL, несомненно, поможет вам начать. Нет смысла изобретать колесо (если только не по дидактическим причинам).

Компьютерная техника также совершила большие скачки с 1990-х годов, тогда память и процессор больше не являются препятствием для компилятора. Таким образом, большинство теоретических оптимизаций из книг теперь возможны.

Следующие шаги языка - поддержка многоядерного программирования, которое является частью стандартного усилия 0x.

Ответ 17

Да и нет. Конечно, для новых проектов он становится все более популярным. Однако по-прежнему существуют препятствия для принятия, которые являются практическими, а не политическими, о которых другие не упомянули. Есть много коммерческих библиотек С++, которые используют ABI от древних компиляторов, которые не поддерживают функции, которые видны в Modern С++, и многие компании полагаются на эти библиотеки. Например, Sun Studio на Solaris не может работать с Boost без использования STLport, но для любой сторонней коммерческой библиотеки, которую вы хотите использовать, потребуется Sun версия STL. Такая же история с GCC 2.95 и Redhat Enterprise Linux.

Ответ 18

Это удивительно, как мало усилий прилагается к тому, чтобы сделать С++ более стабильным. Система предупреждения на месте, но она не очень развивается. Еще проще стрелять в ногу, чем 10 лет назад. Не знаю почему, но С++ по-прежнему остается моим любимым языком.:)