Часть 1. Введение
… Часть 5. Функции Часть 6. Особенности Google Часть 7. Дополнительные возможности C++
…
Эта статья представляет собой перевод части руководства по стилю Google C++ на русский язык.
Оригинальная статья (форк на github), обновленный перевод .
Особенности Google
Существуют различные приемы и инструменты, которые используются для повышения надежности кода C++.И да, они могут отличаться от того, что используют другие компании.
Владение и интеллектуальные указатели
Предпочтительно, чтобы динамически создаваемый объект имел одного (выделенного) владельца.Такое «владение» желательно передавать посредством умных указателей.
Определение Право собственности — это технология учета, используемая для управления динамически выделяемой памятью или другими ресурсами.
Владельцем динамической сущности (объекта) является объект или функция, которая отвечает за удаление сущности, когда она больше не нужна.
Право собственности может быть распределено, и в этом случае ответственность за удаление обычно несет последний оставшийся владелец.
Даже если право собственности не распределено, этот механизм можно использовать для передачи права собственности от одного объекта (или кода) к другому.
Интеллектуальные указатели — это классы, которые функционируют как обычные указатели; например, у них есть перегруженные операторы * И -> .
Некоторые типы умных указателей можно использовать для автоматического управления «владением»: учета владельцев, удаления объектов.
std::unique_ptr Это интеллектуальный указатель, добавленный в C++11, который реализует эксклюзивное владение (только один владелец); объект удаляется, когда экземпляр выходит за пределы области видимости std::unique_ptr .
std::unique_ptr нельзя скопировать, но можно поделиться ( двигаться ) другому std::unique_ptr , что по сути является передачей владения.
std::shared_ptr это интеллектуальный указатель, реализующий распределенное владение.
std::shared_ptr могут быть скопированы с разделением прав собственности между всеми копиями.
Управляемый объект удаляется при уничтожении последней копии.
std::shared_ptr .
Позади
- Очень сложно управлять динамической памятью без какого-либо механизма владения.
- Передача права собственности может быть проще и быстрее, чем копирование объекта.
Кроме того, не все объекты можно скопировать.
- Передача владения может быть проще, чем копирование указателя или использование ссылок, поскольку нет необходимости координировать жизненный цикл объекта между различными частями кода.
- Интеллектуальные указатели могут улучшить читаемость кода, делая его логику более понятной, самодокументируемой и последовательной.
- Интеллектуальные указатели могут исключить ручное управление владением, упростить код и избежать множества ошибок.
- Для константных объектов распределенное владение может быть простой и эффективной альтернативой полному копированию.
- Право собственности должно быть представлено и передано посредством указателей (умных или обычных).
Семантика указателей сложнее, чем работа со значениями, особенно в API: помимо владения нужно беспокоиться о корректности используемых типов (алиасинг), времени жизни, изменчивости объекта и т. д.
- Стоимость производительности копирования значений часто завышена, поэтому выигрыш в производительности от передачи владения (по сравнению с простым копированием) в некоторых случаях не может оправдать ухудшение читаемости и увеличение сложности кода.
- API управления владением могут накладывать свои собственные ограничения на модель управления памятью (порядок).
- При использовании умных указателей нет четкого понимания, где именно (в коде) будут освобождаться ресурсы.
- std::unique_ptr реализует передачу владения через семантику перемещения C++11, которая является новой и может затруднить понимание кода.
- Распределенная собственность, с одной стороны, позволяет тщательно управлять собственностью, с другой – может усложнить архитектуру системы.
- Распределенное владение требует выполнения учетных операций во время выполнения, что может повлиять на производительность.
- В некоторых случаях (например, при создании циклических ссылок) объекты с распределенным владением никогда не будут удалены.
- Умные указатели не всегда могут заменить обычные указатели.
Если другой код хочет получить доступ к этой памяти, он может передать копию, указатель или ссылку (и все это без передачи права собственности).
Предпочтительно использовать std::unique_ptr для явной передачи права собственности.
Например:
Без веской причины не проектируйте (не используйте) код с распределенным владением.std::unique_ptr<Foo> FooFactory(); void FooConsumer(std::unique_ptr<Foo> ptr);
Альтернативно, это может быть желание избежать «тяжелой» операции копирования, но обязательно убедитесь, что выигрыш будет значительным, а общий объект является неизменяемым (т. std::shared_ptr ).
Если требуется распределенное владение, используйте std::shared_ptr .
Никогда не используйте станд::auto_ptr .
В качестве замены есть std::unique_ptr .
cpplint
Чтобы проверить свой код на наличие ошибок стиля, используйте cpplint.py .cpplint.py — это утилита, которая читает файл кода и выявляет множество ошибок стиля.
Конечно, она не идеальна, иногда выдает ложноположительные и ложноотрицательные ошибки, но все равно это полезная утилита.
Ложноположительные ошибки можно устранить, вставив // НОЛИНТ в конце строки кода или // НОЛИНТNEXTLINE на предыдущей строке.
Иногда в проекте есть инструкция, где его взять и как им пользоваться.
cpplint.py .
Если в вашем проекте его нет, то вы можете просто скачать cpplint.py .
Примечания: Изображение взято с Открытый исходный код .
Теги: #C++ #перевод с английского #гид по стилю
-
Продажа Книг Со Скидкой 50% И 30%
19 Oct, 24 -
Thinksecret Вернулся И Расскажет Все
19 Oct, 24 -
Urban Airship Закрывает Бесплатную Лицензию
19 Oct, 24