Подтвердить что ты не робот

С++ 11: новый язык?

Недавно я начал читать (немного) текущий проект для будущего стандарта С++ 11.

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

В любом случае, говоря об этом проекте с некоторыми друзьями, давними разработчиками С++, возникли некоторые проблемы. Итак, я прошу вас (ответить на них):

1) Сам язык

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

В частности, мой друг сказал мне: "Это своего рода новый язык".

  • Можно ли считать это новым языком после этого обновления?
  • Планируете ли вы перейти на новый стандарт или идти в ногу со старым стандартом?

2) Знание языка

  • Как на кривую обучения повлияет новый стандарт?
  • Обучение языку будет сложнее?
  • Некоторые функции, хотя и довольно удивительные, кажутся мне слишком "академическими" (как я имею в виду определение). Я не прав?
  • Освоение всех этих новых дополнений могло бы стать кошмаром, не так ли?
4b9b3361

Ответ 1

Короче говоря, нет, мы не можем считать это новым языком. Это тот же язык, новые возможности. Но вместо того, чтобы быть запертым с помощью Boost libs, теперь они будут стандартными включениями, если вы используете компилятор, который поддерживает стандарт 0x.

При использовании компилятора, поддерживающего новый стандарт, не обязательно использовать новый стандарт. Однако нужно будет изучить и использовать новый стандарт, если существуют определенные ограничения в разрабатываемом программном обеспечении, но это ограничение с любым усилием программного обеспечения. Я думаю, что новые функции, которые приносит стандарт 0x, сделают некоторые вещи более легкими и менее подверженными ошибкам, поэтому с одним преимуществом узнать, что такое новые функции, и как они улучшат свою стратегию проектирования для будущей работы. Нужно также научиться этому, чтобы при работе с программным обеспечением, разработанным с ним, они поймут, что происходит, а не делают большие буо-боны.

Что касается того, перейду ли я к новому стандарту, если это означает, что я буду изучать новый стандарт и использовать его там, где это применимо, и где он увеличивает мою производительность, то да, я, конечно, планирую переключиться. Однако, если это означает, что я ограничусь только работой с новыми функциями стандарта 0x, то нет, так как большая часть моей работы связана с кодом, написанным перед стандартом, и было бы колоссальным обязательством перепроектировать все, чтобы использовать новые функции. Не только это, но и может появиться новые ошибки и проблемы с производительностью, о которых я не знаю без опыта.

Обучение С++ всегда было одним из наиболее сложных путешествий, которые может предпринять программист. Добавление новых функций к языку не изменит трудности изучения его синтаксиса и того, как его эффективно использовать, но подход изменится. Люди все равно узнают о указателях и о том, как они работают, но они также узнают о умных указателях и о том, как они управляются. В некоторых случаях люди будут изучать вещи по-другому, чем раньше. Например, людям все равно нужно будет узнать, как инициализировать вещи, но теперь они узнают об Uniform Initialization и Initializer Lists в качестве основных способов сделать что-то. В некоторых случаях, возможно, понимание вещей будет проще с добавлением нового для синтаксиса диапазонов или типа автоматического возврата в объявлении функции. Я думаю, что в целом, С++ станет легче учиться и использовать, в то же время становится легче преподавать.

Освоение языка - это долгосрочная цель, но это невозможно сделать за ночь. Глупо думать, что можно быстро овладеть чем-то сложным, как С++. Это требует практики, опыта и отладки кода, чтобы действительно забить что-то. Академическое обучение - это одно, но использование этих знаний - это совершенно другой монстр. Я думаю, что если вы уже овладеете языком С++, новые концепции не будут слишком зависеть от этого, но у нового посетителя может быть преимущество в том, что они не будут изучать некоторые из более устаревших способов делать вещи.

Ответ 2

1) Сам язык

Насколько я знаю, на самом деле изменений в С++ '03 и С++' 0x. Единственный, о котором я могу думать, относится к использованию auto как спецификатор класса хранения, но поскольку он не имел семантического что я не вижу в этом проблемы.

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

2) Знание языка

Лично я считаю, что для 99,9% разработчиков С++ более новый язык будет проще в использовании. Я специально думаю об особенностях, таких как авто, лямбда и constexpr. Эти функции действительно должны сделать использование языка более приятным.

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

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

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

Обновить пост FDIS для голосования:

Как это бывает, "понятия" были удалены для С++ 0x и снова будут рассмотрены для С++ 1x. В конце есть некоторые изменения, кроме auto, которые могут сломать ваш код, но на практике они, вероятно, будут довольно редкими. Основные отличия можно найти в Приложении C.2 FDIS (pdf).

Ответ 3

Для меня одним из самых важных будет:

unique_ptr + std:: move()!

Представьте себе:

  • Интеллектуальный указатель без каких-либо накладных расходов:

    • нет операций подсчета ссылок
    • нет дополнительного хранилища для переменной счетчика ссылок
  • Умный указатель, который может быть перемещен, т.е. без вызовов деструктора/конструктора при перемещении

Что это дает вам? Исключить безопасные, дешевые (указатели..) контейнеры без каких-либо затрат. Контейнер сможет использовать только memcpy() unique_ptrs, поэтому потери производительности не будут вызваны регулярным указателем с помощью умного указателя! Итак, еще раз:

  • Вы можете использовать указатели
  • Это будет безопасно (без утечек памяти)
  • Это ничего не будет стоить
  • Вы сможете хранить их в контейнерах, и они смогут делать "массовые" ходы (memcpy-like) с ними дешево.
  • Это будет исключение.

:)

Другая точка зрения:

  • На самом деле, когда вы перемещаете группу объектов с помощью функции copy(), для каждого экземпляра объекта существует вызов конструктора и деструктора. Когда вы копируете 1000 объектов размером 1kb, будут выполняться хотя бы один вызов функции memcpy() и 2000.
  • Если вы хотите избежать тысяч вызовов, вам придется использовать указатели.
  • Но указатели: опасны и т.д. Фактические интеллектуальные указатели не помогут вам, они решают другие проблемы.
  • На данный момент решения нет. Время от времени вы должны платить за дизайн С++ RAII/pointer/valuevars. Но с С++ 0x использование unique_ptr позволит делать "массивные" перемещения объектов (да, практически объекты, поскольку указатель будет умным) без "массивных" вызовов конструктора/деструктора и без риска использования указателей! Для меня это действительно важно.

Это нравится расслабление концепции RAII (из-за использования указателей) без потери преимуществ RAII. Другой аспект: указатель, завернутый в unique_ptr(), будет вести себя во многих аспектах, похожих на переменную ссылочного объекта java. Разница в том, что unique_ptr() сможет существовать только в одной области за раз.

Ответ 4

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

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

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

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

Ответ 5

В некоторых отношениях С++ 0x должен быть проще преподавать/учиться, чем текущий С++:

  • Прохождение через контейнер - новый синтаксис for намного проще, чем for_each + функтор или цикл с использованием итераторов
  • Инициализация контейнеров: мы сможем инициализировать последовательности с тем же синтаксисом, что и массивы
  • Управление памятью: из-за устаревшего старого auto_ptr, в нем четко определены unique_ptr и shared_ptr

Lambdas, хотя и обязательно более сложный, чем эквиваленты других языков, будет легче изучать, чем процесс С++ 98 для определения объектов функции в другой области.

Ответ 6

Планируете ли вы перейти на новый стандарт или идти в ногу со старым стандартом?

Год назад я писал строгий C89, потому что рассматриваемый продукт был агрессивно переносимым для встроенных платформ, некоторые из которых имели компиляторы с радикально отличающимися идеями, из которых бит C99 он заслуживает поддержки. Таким образом, 20-летний стандарт все еще не был полностью заменен его 10-летним преемником.

Поэтому я не ожидаю, что скоро удастся уйти от С++ 03.

Я ожидаю использовать возможности С++ 0x, где это необходимо. Точно так же, как я использую функции C99 в C-коде и расширения gcc в C и С++ (и буду использовать расширения MSVC, хотя я никогда не работал с кодом MSVC только для более чем тривиального количества времени). Но я ожидаю, что это будет "приятно иметь", а не базовый, в значительной степени неопределенно.

Ответ 7

У вас есть точка, но это всегда было так. Существует много кода на С++, который до сих пор не содержит ничего из стандарта "98" только из-за врожденного консерватизма некоторых кодировщиков. Некоторые из нас помнят темное время перед пространством имен std:: (до фактических пространств имен), когда каждый писал свой собственный класс строк, а указатели все время ходили вокруг. Существует причина, по которой мы говорим о "современном стиле C++" - отличать от более раннего стиля, потому что некоторым людям по-прежнему приходится поддерживать или обновлять код в этом стиле.

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

С появлением С++ 0x в компиляторах доставки этот разговор будет разыгрываться снова и снова в командах разработчиков по всему миру:

МОЛОДЕЖЬ: Я только что открыл эти вещи, называемые лямбдами! И я нахожу много способов использовать их, чтобы сделать наш код более выразительным! Послушайте, я переписал ваш старый класс Foo, не так ли аккуратнее?

OLDSTER: В моем старом классе Foo не было ничего плохого. Вы просто ищете оправдания, чтобы использовать "крутую" новую функцию без необходимости. Почему вы продолжаете пытаться сделать мою жизнь такой сложной? Зачем мне постоянно учиться чему-то новому? Нам нужна еще одна война, что нам нужно.

YOUNGSTER: Ты просто слишком застрял на своем пути, старик, мы не должны даже использовать С++ в эти дни... если бы это было до меня -

OLDSTER: Если бы это зависело от меня, мы бы застряли с PL/1, но нет... моей жене пришлось голосовать за Картера, и теперь мы застряли со всем этим объектно-ориентированным дерьмом. Нет ничего, что можно сделать с std::transform и lambdas, которые я не могу сделать с goto и несколькими ярлыками.

и др.

Ответ 8

Ваша карьера программирования всегда будет включать обучение и переобучение. Вы не можете ожидать, что С++ останется прежним до тех пор, пока вы не уйдете на пенсию и не будете использовать те же методы и методы, которые вы использовали 40 лет назад. Технология работает, и она быстро катится. Это ваша работа, чтобы идти в ногу с этим. Конечно, вы можете игнорировать это и продолжать работать так же, как и в настоящее время, но через 5-10 лет вы станете настолько устаревшими, что будете вынуждены учиться всему этому, когда пытаетесь изменить работу, И было бы намного легче учиться на работе все эти годы раньше:)

Ответ 9

Несколько месяцев назад я услышал Bjarne Stroustrup, чтобы поговорить под названием 50 лет С++. По общему признанию, я не программист на С++, но мне показалось, что он, конечно, не думает, что 0x - это новый язык!

Ответ 10

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

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

Это большое обновление, да, но оно ориентировано на десятилетний опыт работы с текущим стандартом С++. Каждое изменение происходит там, потому что опыт показал, что это необходимо. На самом деле комитет крайне осторожен и консервативен и отказался от огромного количества других улучшений языка. Здесь добавляются только основные принципы, которые 1) каждый мог бы согласовать, и 2) мог быть указан во времени, не задерживая новый стандарт.

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

Ответ 11

Концепции и концептуальные карты значительно повысят надежность баз шаблонов. Если вы когда-либо заливали источник Boost, вы поймете, что я имею в виду. Вы постоянно переходите от источника к документам, потому что язык просто не имеет возможности выражать концепции шаблонов. Надеюсь, Concepts + Duck Typing предоставит нам лучшее из обоих миров, в котором точки входа в библиотеки шаблонов могут явно объявлять требования, но при этом иметь свободу, предоставляемую Duck Typing при написании общего кода.

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