Как сделать переход на C ++ 11?

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

Я знаю, что в стандартной библиотеке C ++ есть много контейнеров, таких как векторы, карты и строки, а C ++ 11 добавляет к этому только std :: array и ranged loop.

Как лучше всего научиться использовать эти современные языковые функции и которые подходят для каких моментов? Правильно ли, что разработка программного обеспечения в C ++ в настоящее время в основном не содержит ручного управления памятью?

Наконец, какой компилятор я должен использовать, чтобы максимально использовать новый стандарт? Visual Studio имеет отличные инструменты для отладки, но даже VS2012, похоже, имеет ужасную поддержку C ++ 11.

35 голосов | спросил Overv 23 +04002012-10-23T02:37:16+04:00312012bEurope/MoscowTue, 23 Oct 2012 02:37:16 +0400 2012, 02:37:16

4 ответа


50

Во-первых, некоторые эмпирические правила:

  • Используйте std::unique_ptr как интеллектуальный указатель без надбавок. Вам не нужно часто беспокоиться о необработанных указателях. std::shared_ptr также не требуется в большинстве случаев. Стремление к совместному владению часто в первую очередь выдает заблуждение о собственности.

  • Используйте std::array для массивов статической длины и std::vector для динамического.

  • Широко использовать общие алгоритмы, в частности:

      <algorithm> литий> <numeric> литий> <iterator> литий> <functional> литий>
  • Используйте auto и decltype()

  • Сделайте вещи безопасными по типу, когда сможете. Когда у вас есть утверждения, которые принуждают инварианты к определенному типу вещей, эта логика может быть централизована в типе. И это не обязательно для каких-либо дополнительных затрат времени исполнения. Разумеется, следует избегать приведения C-стиля ((T)x) в пользу более явного (и доступного для поиска!) C ++ -style casts (например, static_cast).

  • Наконец, знайте, как правило из трех:

    • Destructor
    • Конструктор копирования
    • Оператор присваивания

    Стало правилом пять с добавлением конструктора перемещения и оператора переадресации. И понять ссылки rvalue вообще и как избежать копирования.

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

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

Что касается компилятора, то G ++ и Clang являются конкурентоспособными с точки зрения возможностей C ++ 11 и быстро догоняют их недостатки. Я не использую Visual Studio, поэтому я не могу говорить ни о нем, ни о нем.

Наконец, примечание о std::for_each: вообще избегайте его.

transform, accumulate и erase - remove_if являются добрыми старыми функциональными ---- +: = 19 =: + ----, map и fold. Но filter является более общим и, следовательно, менее значимым - он не выражает никаких намерений , кроме цикла. Кроме того, он используется в тех же ситуациях, что и на основе диапазона for_each, и синтаксически тяжелее даже при использовании без точек. Рассмотрим:

for
ответил Jon Purdy 23 +04002012-10-23T02:50:10+04:00312012bEurope/MoscowTue, 23 Oct 2012 02:50:10 +0400 2012, 02:50:10
12

В качестве отправной точки:

  • Прекратить использование char* для строк. Используйте std::string или std::wstring и просто смотрите код становится короче, читабельнее и безопаснее
  • Прекратите использование массивов в стиле C (вещи, объявленные с помощью [ ]) и используйте std::vector или какой-либо другой соответствующий класс контейнера. Хорошие вещи о std::vector заключаются в том, что он знает свою собственную длину, он очищает свое содержимое, когда он выходит из сферы действия, легко итерация, и она становится больше, когда вы добавляете больше предметов. Но есть и другие коллекции, которые могут работать даже лучше для ваших обстоятельств.
  • Используйте std::unique_ptr - и узнайте std::move почти сразу. Так как это может привести к некоторым не подлежащим копированию объектам, лень может иногда посылать вас на std::shared_ptr - и у вас могут быть некоторые примеры использования для std::shared_ptr, а также
  • Используйте auto при объявлении итераторов и типов, которые зависят от более ранних объявлений (например, ранее вы объявили вектор чего-то, теперь вы объявляя что-то, используйте auto)
  • Использовать алгоритмы и for_each по "необработанному для", когда вы можете, так как он заставляет других внимательно читать ваш цикл, чтобы сделать вывод, что вы на самом деле, итерации по всей коллекции и т. д. Если ваш компилятор поддерживает «диапазон для», то используйте его над for_each. Изучите тривиальные алгоритмы, такие как iota, generate , accumulate, find_if и так далее.
  • Используйте lambdas - это простой способ использовать алгоритмы. Они также открывают дверь гораздо больше.

Не слишком разбирайтесь в компиляторе. «Страшная, ужасная» нехватка поддержки C ++ 11 в VS2012 заключается в том, что нет вариативных шаблонов (да, вы были примерно для использования вариативных шаблонов) и {} не существует. Я тоже хочу этого, но вряд ли я прекращу использовать полезный инструмент для разработки.

Второе, что нужно сделать после обхода std::, должно начать думать о RAII. Каждый раз, когда вы

  • начальное действие
  • серия действий с чем-то, что вы получили от запуска.
  • действие очистки, которое должно произойти даже в случае исключений

Тогда у вас есть конструктор, несколько функций-членов и деструктор. Напишите класс, который позаботится об этом для вас. Возможно, вам даже не придется писать ctor и dtor. Помещение кода shared_ptr в качестве переменной-члена класса является примером RAII - вы не пишете код управления памятью, но когда ваш экземпляр выходит из сферы действия, правильные вещи произойдут. Расширьте это мышление, чтобы охватить такие вещи, как закрытие файлов, освобождение ручек, блокировок и т. Д. И код просто станут проще и меньше (при устранении утечек) перед вашими глазами.

Если вы чувствуете себя действительно уверенно, очищайте printf в пользу cout, избавиться от макросов (#define) и начать изучать некоторые «продвинутые идиомы», такие как PIMPL , У меня есть весь курс по этому вопросу в Pluralsight, который вы, вероятно, можете смотреть, используя свои бесплатные исследование.

ответил Kate Gregory 23 +04002012-10-23T15:13:35+04:00312012bEurope/MoscowTue, 23 Oct 2012 15:13:35 +0400 2012, 15:13:35
3
  

Как лучше всего научиться использовать эти современные языковые функции и которые подходят для каких моментов?

Программирование. Опыт - лучший способ узнать.

В C ++ 11 есть много новых функций (auto, rvalue, new smart pointers - просто назвать несколько). Лучшее начало - просто начать использовать их и читать о них каждый раз, когда сможете, и всякий раз, когда вы найдете интересную статью.

  

Правильно ли, что разработка программного обеспечения в C ++ в настоящее время в основном не содержит ручного управления памятью?

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

Если вам нужно использовать Qt, вам придется использовать свои правила для управления памятью.

  

, какой компилятор должен использовать, чтобы максимально использовать новый стандарт?

Независимо от того, что у вас есть под рукой, который поддерживает новейший стандарт:

, но компилятор не поддерживает все функции.

ответил BЈовић 23 +04002012-10-23T14:42:51+04:00312012bEurope/MoscowTue, 23 Oct 2012 14:42:51 +0400 2012, 14:42:51
-7

Мой университет по-прежнему использует C ++ для обучения. Я программировал с C ++ в течение 5 лет, и теперь я аспирант. Конечно, теперь я использую много Java, Ruby и т. Д. Я действительно рекомендую вам не спешить с такими функциями на языке, как Java. По моему опыту и мнению, после низкоуровневых особенностей C ++. Вы должны изучать такие темы, как универсальное программирование с использованием C /C ++, например, создание шаблона, функции шаблона, переопределения оператора, виртуальные методы, интеллектуальные указатели. Для объектно-ориентированной части дизайна существует множество возможностей C ++, а Java - нет, например, многоуровневое. Наследование мощное, но опасное тоже. Уровень реализации объектно-ориентированного дизайна на C ++ - тоже хорошая тема. Межпроцессные коммуникации, потоки, важны и на C ++.

Для компилятора и отладчика. Я знаю, что визуальная студия потрясающая. Но я действительно рекомендую вам изучить GDB, Valgrind и Make still, и быть хорошими в этих инструментах. Microsoft удивительна, но для вас это слишком много. Как студент, вам действительно нужно узнать те вещи, которые Microsoft сделала с вами. Для компилятора G ++ хорош для GNU.

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

ответил Sen Han 23 +04002012-10-23T05:25:02+04:00312012bEurope/MoscowTue, 23 Oct 2012 05:25:02 +0400 2012, 05:25:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132