Senior C++ Developer
12.6K subscribers
1.33K photos
3 videos
601 links
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
Что такое RAII?

RAII (Resource Acquisition Is Initialization) — это идиома в C++, которая используется для управления ресурсами, такими как память или файлы, с помощью механизма автоматического управления памятью (например, деструкторами объектов).

Идея RAII заключается в том, что ресурсы выделяются при создании объекта и освобождаются при уничтожении объекта, что происходит автоматически при выходе объекта из области видимости. Это позволяет гарантировать корректное управление ресурсами и избежать утечек.

#для_продвинутых
namespace alias

В C++, вы можете использовать «namespace alias» (псевдоним пространства имен) для упрощения работы с длинными именами пространств имен. Это позволяет вам создать более короткий псевдоним для длинного имени пространства имен, что улучшает читаемость кода и уменьшает вероятность конфликтов имен.

Для создания псевдонима пространства имен используйте ключевое слово namespace с алиасом (псевдонимом).

#для_продвинутых
Аллокатор

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

В стандартной библиотеке C++ есть несколько аллокаторов, таких как new и delete, которые предоставляют базовую функциональность выделения и освобождения памяти. Однако C++ также предоставляет механизмы для создания собственных аллокаторов, которые могут быть настроены и оптимизированы под конкретные нужды приложения.

#для_продвинутых
Переполнение буфера (Buffer Overflow)

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

В C++ переполнение буфера может возникнуть, если программист не проверяет длину входных данных перед записью их в буфер.

#для_продвинутых
SIMD

SIMD (Single Instruction, Multiple Data) инструкции представляют собой набор команд и возможностей, предоставляемых аппаратным средством процессора, которые позволяют выполнять одну операцию над несколькими элементами данных одновременно.

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

#для_продвинутых
Модульные тесты

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

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

#для_начинающих
Placement new

Placement new — это специальный оператор, который позволяет создавать объекты в заданной области памяти, вместо выделения новой памяти для объекта. Это полезно, когда вы хотите явно контролировать расположение объектов в памяти, например, при работе с устройствами ввода-вывода или при реализации собственных аллокаторов.

Обратите внимание, что после использования объекта, созданного с помощью placement new, вы должны вызвать его деструктор явно, как показано в примере выше. Это необходимо для правильного освобождения ресурсов и избежания утечек памяти.

#для_продвинутых
std::search

Функция std::search используется для поиска последовательности элементов в другой последовательности. Она находит первое вхождение подпоследовательности элементов в заданной последовательности и возвращает итератор, указывающий на начало этого вхождения, или итератор, указывающий на конец последовательности, если подпоследовательность не найдена.

#для_начинающих
Cache miss

Cache miss (промах в кэше) в C++ относится к ситуации, когда процессор не может найти нужные данные в кэше, и должен обратиться к более медленной памяти (например ОЗУ), для получения этих данных.

Когда код выполняется на процессоре, процессор пытается загрузить данные или инструкции из кэша первого, второго или третьего уровня (L1, L2, L3 и так далее), прежде чем обращаться к оперативной памяти. Если данные или инструкции отсутствуют в кэше, возникает кэш-промах (cache miss), и процессор должен загрузить их из оперативной памяти, что занимает гораздо больше времени, чем доступ к данным в кэше.

#для_продвинутых
Мocking

Мокирование — это процесс создания имитаций (моков) объектов или компонентов программы, чтобы тестировать код без необходимости использовать реальные зависимости.

Основная цель мокирования в тестировании — изолировать код, который вы хотите протестировать, от внешних зависимостей, таких как базы данных, сетевые сервисы или другие сложные компоненты. Вместо использования реальных объектов или служб, вы создаете моки, которые имитируют поведение этих зависимостей, и управляете этим поведением в рамках ваших тестов.

#для_продвинутых
std::conditional_variable

Стандартная библиотека предоставляет два компонента для работы с многопоточностью: std::thread для создания и управления потоками и std::mutex для обеспечения синхронизации доступа к общим данным. Для синхронизации потоков при ожидании определенных условий используется std::condition_variable.

std::condition_variable представляет собой механизм, который позволяет одному потоку ждать, пока другой поток выполняет определенные действия, и затем оповещать первый поток о завершении выполнения этих действий. Она используется вместе с std::unique_lock (или другими мьютексами) для ожидания изменения состояния.

#для_продвинутых
Конструктор по умолчанию

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

Конструктор по умолчанию выполняет инициализацию объекта класса, задавая начальные значения его членов. Если класс имеет члены-переменные, они будут инициализированы значениями по умолчанию для своих типов данных (например, числовые типы будут инициализированы нулями, указатели — нулевыми указателями и т.д.).

#для_начинающих
Aggregate initialization

Aggregate initialization (Инициализация агрегатов) — это способ инициализации структур, классов и массивов в C++. Этот способ позволяет инициализировать члены агрегата (поля структуры или класса, элементы массива) при создании объекта без необходимости вызова конструкторов.

Aggregate initialization особенно полезна, когда объекты имеют простую структуру и не требуют сложной логики инициализации. Это позволяет упростить код и сделать его более читаемым.

#для_продвинутых
Run-time type identification

Run-time type identification (RTTI) — это механизм, который позволяет программе определить тип объекта во время выполнения (в рантайме). Это означает, что вы можете определить фактический тип объекта, на который указывает указатель или ссылка, даже если его статический тип (определенный на момент компиляции) отличается.

#для_продвинутых
constexpr

constexpr — это ключевое слово в C++, которое используется для указания компилятору, что функция или переменная может быть вычислена во время компиляции. Это позволяет выполнить некоторые вычисления на этапе компиляции, вместо выполнения их во время выполнения программы.

#для_начинающих
Встраиваемые функции

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

#для_начинающих
static_assert

static_assert — это механизм в C++, который позволяет выполнять проверки на этапе компиляции для статических условий. Он был добавлен в стандарт C++11 и предоставляет способ проверки, что определенное условие истинно во время компиляции. Если условие ложно, компиляция завершится ошибкой.

#для_начинающих
Директива define

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

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

#для_продвинутых
Что такое dynamic_cast?

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

Оператор dynamic_cast применяется преимущественно в контексте полиморфизма, когда у вас есть иерархия классов с виртуальными функциями, и вы хотите выполнить динамическое приведение типов среди объектов этой иерархии.

#для_начинающих
Что такое vptr?

vptr означает «virtual pointer» (виртуальный указатель) и является частью механизма виртуальных функций и полиморфизма.

Когда класс содержит хотя бы одну виртуальную функцию, компилятор добавляет в этот класс скрытый указатель, который называется vptr. Этот указатель указывает на таблицу виртуальных функций, которая называется «таблицей виртуальных функций» или «vtable». В этой таблице содержатся указатели на реализации виртуальных функций для данного класса и всех его производных классов.

#для_начинающих