Senior C++ Developer
13.1K subscribers
1.26K photos
3 videos
576 links
№ 4931128893
Изучаем C++.

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

std::byte — это тип данных, введенный в стандарт C++17. Он представляет собой один байт, то есть 8 бит. std::byte не является ни типом символа, ни типом числа. Он предназначен для представления байтов в памяти, независимо от того, используются они для хранения символов, чисел или чего-либо еще.

std::byte может использоваться в следующих случаях:
— Для доступа к памяти, занимаемой другими объектами.
— Для работы с низкоуровневыми функциями, такими как чтение и запись в порты ввода-вывода.
— Для реализации собственных типов данных, которые должны хранить байты.

#для_продвинутых
Концепт Derived

Концепт Derived в C++ используется для проверки того, является ли указанный тип производным от другого типа. Концепт имеет два шаблонных параметра: Derived и Base.

Концепт Derived удовлетворяется, если и только если Base является классом, который является либо Derived, либо публичным и недвусмысленным базовым классом Derived, игнорируя cv-модификаторы.

Например, код выше удовлетворяет концепту Derived.

#для_продвинутых
#вопросы_с_собеседований
Как работает механизм перегрузки операторов в C++ и какие ограничения существуют при его использовании?


В C++, перегрузка операторов позволяет программистам определять поведение стандартных операторов (например, +, -, *, /) для пользовательских типов данных. Это делается путем определения функций или методов класса с специальным именем: operatorX, где X - это оператор, который нужно перегрузить. Однако существуют ограничения: нельзя перегружать операторы для встроенных типов данных (только если одним из операндов является пользовательский тип), нельзя создавать новые операторы, и некоторые операторы (например, ?:, .) не подлежат перегрузке. Перегрузка операторов должна использоваться с осторожностью, чтобы не нарушить интуитивные ожидания от работы этих операторов.
Принцип DRY

Принцип DRY (Don't Repeat Yourself) — это основной принцип программирования, который призывает избегать дублирования кода. Этот принцип подразумевает, что каждая часть информации или логики должна существовать в системе только в одном месте. В контексте С++ принцип DRY означает, что вы должны избегать повторения кода, функций, классов или любых других конструкций.

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

std::lock_guard — это один из классов в стандартной библиотеке C++, предназначенных для обеспечения многопоточной безопасности при работе с разделяемыми данными. Он используется для автоматического захвата и освобождения мьютекса (mutex) при входе и выходе из блока кода.

Прежде всего, мьютекс (mutex) — это механизм синхронизации, который предоставляет эксклюзивный доступ к разделяемым данным одному потоку в данный момент времени. std::lock_guard является удобной оберткой для работы с мьютексами.

#для_продвинутых
Принцип lock-free

Принцип lock-free (без блокировок) в С++ относится к методам многопоточного программирования, которые позволяют избегать использования блокировок (locks) для обеспечения безопасности доступа к данным из нескольких потоков.

Основная идея lock-free программирования заключается в том, чтобы позволить нескольким потокам одновременно работать с общими данными без блокировки выполнения одного или нескольких потоков.

Однако стоит отметить, что написание lock-free кода может быть сложным и требовать более глубокого понимания атомарных операций и алгоритмов.

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

Undefined behavior (неопределенное поведение) — это концепция в C++, которая означает, что результат выполнения определенного кода программы не определен и может быть непредсказуемым. Это означает, что в случае наличия undefined behavior в программе нельзя надеяться на какие-либо гарантированные результаты, и программа может вести себя по-разному в разных средах выполнения или даже в разные моменты времени.

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

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

Дружественные функции (friend functions) — это функции, которые объявлены как дружественные внутри класса и имеют доступ к закрытым и защищенным членам этого класса. Это позволяет функциям, которые не являются методами класса, работать с его данными. Дружественные функции объявляются с использованием ключевого слова friend внутри определения класса.

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

#для_начинающих
Принцип YAGNI

Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».

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

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

#для_продвинутых
#вопросы_с_собеседований
Что такое флажки компиляции?

Флажки компиляции — это специальные опции, которые можно указать при компиляции кода, чтобы включить или отключить определенные возможности языка или библиотек.

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

Например:
std=c++11: включает поддержку стандарта C++11.
O2: включает оптимизацию кода на уровне O2.
g: добавляет отладочную информацию в скомпилированный файл.
Wall: включает предупреждения обо всех возможных ошибках.
DDEBUG: определяет макрос DEBUG, чтобы можно было использовать условную компиляцию.
I<path>: добавляет директорию по указанному пути в поиск заголовочных файлов.
#вопросы_с_собеседований
Зачем нужен виртуальный деструктор?

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

Без ключевого слова virtual у родительского класса Base деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только ~Base():
Hello from ~Base()
string at()

std::string::at можно использовать для извлечения символов по символам из заданной строки.

Подробнее ознакомиться можно здесь.
Работа с файлами

Для того, чтобы прочитать файл, понадобится выполнить те же шаги, что и при записи, с небольшими изменениями:
1) создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
2) прочитать файл;
3) закрыть файл.
Call Stack Logger — инструментирование функций как способ отслеживания потока выполнения программы

Доводилось ли вам когда-нибудь работать над C++ проектом с такой огромной кодовой базой, что понимание того, что на самом деле происходит во время выполнения программы, требует кучи времени и сил?

Смотреть статью
Атрибуты [[likely]] и [[unlikely]]

В C++20 мы получили новые атрибуты [[likely]] и [[unlikely]], которые позволяют подсказывать оптимизатору, является ли путь выполнения более или менее вероятным.
Строковые литералы как параметры шаблона

Начиная с C ++ 20, вы можете использовать строку в качестве параметра шаблона, не являющегося типом. Идея состоит в том, чтобы использовать стандартную строку basic_fixed_string, которая имеет конструктор constexpr. Конструктор constexpr позволяет ему создать экземпляр фиксированной строки во время компиляции.

Вроде бы мелочь, а приятно — не нужно производить обходных маневров и использовать лишнюю память.
Кортеж — tuple

Как и pair, tuple — коллекция значений различных типов данных конкретного размера.

В некоторых случаях вместо tuple удобнее использовать std::array. Это обычный массив с некоторыми функциями стандартной библиотеки C++, который был добавлен в C++11.