Zero-cost abstractions
Абстракции языка и библиотеки рассчитаны на то, чтобы при оптимизации компилятор мог убрать лишние уровни и сгенерировать эффективный машинный код.
Раздел справочника
C++ — компилируемый язык общего назначения с поддержкой процедурного, объектно-ориентированного, обобщённого и метапрограммирования. Этот раздел собирает краткие справочные материалы по синтаксису, объектной модели, времени жизни объектов, шаблонам, стандартной библиотеке и современным возможностям языка.
Обзор
C++ часто используют там, где нужно контролировать производительность, время жизни объектов, layout данных и стоимость абстракций. В отличие от языков с обязательной сборкой мусора, C++ позволяет управлять ресурсами через детерминированные деструкторы.
new/delete в бизнес-логике. Владение ресурсами выражается
через объекты: std::vector, std::string,
std::unique_ptr, std::shared_ptr,
файловые и сетевые обёртки.
Абстракции языка и библиотеки рассчитаны на то, чтобы при оптимизации компилятор мог убрать лишние уровни и сгенерировать эффективный машинный код.
Значения можно копировать, перемещать, хранить в контейнерах, передавать по ссылке или владению. Это влияет на API и стоимость операций.
Некоторые ошибки не обязаны диагностироваться: выход за границы, use-after-free, нарушение strict aliasing и гонки данных приводят к неопределённому поведению.
Language
Фундаментальные типы, cv-квалификаторы, auto, decltype, type aliases.
Ссылкиlvalue references, rvalue references, forwarding references.
ФункцииПерегрузка, default arguments, inline, constexpr, noexcept.
КлассыПоля, методы, конструкторы, деструкторы, инкапсуляция.
ОператорыПерегрузка операторов, conversion operators, explicit.
Исключенияthrow, try/catch, exception safety, noexcept-гарантии.
Object model
Объект в C++ имеет тип, область хранения, время жизни, адрес и набор допустимых операций. Для классов дополнительно важны специальные функции-члены: конструктор по умолчанию, копирующий конструктор, move-конструктор, операторы присваивания и деструктор.
class Buffer {
public:
Buffer() = default;
explicit Buffer(std::size_t size)
: data_(size) {}
std::size_t size() const noexcept {
return data_.size();
}
private:
std::vector<std::byte> data_;
};
Этот класс следует Rule of Zero: он не управляет памятью вручную,
а делегирует владение контейнеру std::vector.
Memory
Ошибки времени жизни — одна из главных причин сложных дефектов в C++. Нужно различать область видимости имени, область хранения объекта и фактическое время жизни объекта.
Локальные объекты обычно создаются при входе в блок и уничтожаются при выходе из блока.
Объекты создаются в динамической памяти. В современном C++ прямой
new обычно заменяется на контейнеры и smart pointers.
Объекты существуют в течение всей программы. Сюда относятся глобальные переменные и статические локальные объекты.
Объекты с thread_local имеют отдельный экземпляр
для каждого потока.
Templates
Шаблоны позволяют писать код, параметризованный типами, значениями и другими шаблонами. Они используются в контейнерах, алгоритмах, type traits, smart pointers и compile-time вычислениях.
template <typename T>
T max_value(const T& a, const T& b) {
return b < a ? a : b;
}
Шаблоны функций позволяют обобщить алгоритм для разных типов.
Шаблоны классов лежат в основе контейнеров вроде std::vector<T>.
Начиная с C++20, constraints позволяют явно описывать требования к типам.
Standard library
Стандартная библиотека предоставляет контейнеры, алгоритмы, итераторы, строки, умные указатели, утилиты для времени, файловой системы, многопоточности и синхронизации.
Динамический массив с непрерывным хранением элементов.
std::stringСтрока с владением памятью и удобными операциями.
std::unique_ptrЕдиноличное владение динамическим объектом.
std::shared_ptrРазделяемое владение через счётчик ссылок.
<algorithm>Сортировка, поиск, перестановки, копирование и трансформация.
<thread>Потоки исполнения, join/detach и базовая многопоточность.
Standards
Examples
#include <fstream>
#include <string>
std::string read_first_line(const char* path) {
std::ifstream file(path);
std::string line;
std::getline(file, line);
return line;
}
Поток std::ifstream закрывает файл в деструкторе.
Ручной вызов close() обычно не нужен.
#include <memory>
struct Connection {
void send(const char* data);
};
void use(std::unique_ptr<Connection> conn) {
conn->send("ping");
}
auto conn = std::make_unique<Connection>();
use(std::move(conn));
std::unique_ptr нельзя копировать, но можно перемещать.
Так API явно показывает передачу владения.