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

По вопросам сотрудничества: @adv_and_pr
Download Telegram
Исключения в C++: безопасность, спецификации, бенчмарки

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

Смотреть статью
Возврат нескольких значений из функции

Вы можете написать функцию, которая будет возвращать два и более значений, с помощью std::tuple и std::tie.
Функция atoi

Функция atoi преобразует строку string в целое значение типа int. Анализируя строку string, atoi интерпретирует её содержание, как целое число, которое возвращается как int.

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

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

Если первая последовательность не-пробельных символов в строке string не является целым числом, или, если string пустая или содержит только пробельные символы, преобразование не выполняется.
Примеры C++ кода до и после Ranges

Измените несортированный диапазон, чтобы он сохранял только уникальные значения, но в обратном порядке.
Аллокатор

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

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

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

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

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

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

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

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

#для_продвинутых
Паттерн проектирования «Посетитель»

Паттерн проектирования «Посетитель» (Visitor) — это поведенческий паттерн, который позволяет добавлять новые операции к объектам без изменения их классов. Он достигается путем создания специального объекта, называемого "посетителем", который посещает все элементы объекта и выполняет необходимую операцию.

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

#для_продвинутых
#вопросы_с_собеседований
Какие есть особенности работы с shared memory?

Работа с разделяемой памятью (shared memory) предполагает использование операций чтения и записи данных в общую область памяти, которая разделяется между несколькими процессами.

Среди особенностей можно выделить основные:

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

Кроме того, при работе с shared memory необходимо учитывать, что изменения данных в одном процессе автоматически не отображаются в других процессах. Для обновления данных необходимо явно синхронизироваться между процессами.

Также необходимо учитывать, что при работе с shared memory необходимо правильно управлять выделением и освобождением памяти, чтобы избежать утечек памяти и других проблем, связанных с неправильной работой с памятью.
#вопросы_с_собеседований
Какие примитивы синхронизации реализованы в C++?

В с++ реализовано множество примитивов синхронизации, ниже представлены их предназначения:

Mutex - используется для блокировки мьютекса при доступе к разделяемому ресурсу.

lockguard и uniquelock - используются для автоматической блокировки и разблокировки мьютекса.

condition_variable - используется для уведомления потоков о состоянии разделяемого ресурса.

atomic - используется для атомарной операции с переменными.

semaphore - используется для синхронизации доступа к ограниченному количеству ресурсов.

barrier - используется для синхронизации потоков, когда все потоки должны достичь определенной точки их выполнения перед тем, как продолжить работу.
Что нужно дописать, чтобы при вызове конструктора перемещения член класса действительно "переместился"?

Нужно дописать std::move в списке инициализации перемещающего конструктора:
A(A&& oth) : str(std::move(oth.str)){ }

Но это гарантирует "перемещение" только в том случае, если у этого объекта, в свою очередь, есть перемещающий конструктор (в данном случае, у std::string он есть).
Декларатор ссылки lvalue: &

Содержит адрес объекта, но синтаксически ведет себя подобно объекту.

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

Любой объект, адрес которого можно преобразовать в некоторый тип указателя, можно также преобразовать в аналогичный ссылочный тип. Например, любой объект, адрес которого можно преобразовать в тип char *, можно также преобразовать в тип char &.

В примере демонстрируется декларатор ссылки путем объявления объекта Person и ссылки на этот объект. Поскольку rFriend является ссылкой на myFriend, при обновлении любой из этих переменных изменяется один и тот же объект.
GTK+

Один из самых популярных графических фреймворков нарадяду с Qt, предназначен для создания виджетов, GUI и просто красивых графических оболочек программы, поддерживает Windows, macOS X, Linux и Unix-подобные системы.

https://www.gtk.org/
Nana

Nana — это кроссплатформенная библиотека для программирования GUI в стиле современного C++. Поддерживаемые системы: Windows, Linux (X11) и Mac OS (экспериментально). Поддержка С++11\17 даёт возможность использовать современные фичи C++: лямбды, умные указатели и стандартную библиотеку. Так как это не фреймворк, использование Nana не будет оказывать влияния на архитектуру программы.

Здесь можно посмотреть документацию и примеры.
Пространство имен

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

В этом примере MyNamespace — это пространство имен, которое содержит функцию myFunction. Чтобы вызвать функцию из этого пространства имен, используется оператор разрешения области ::.

#для_начинающих
This media is not supported in your browser
VIEW IN TELEGRAM
🎮 Hypersomnia - интересный проект для пркатики на C++. Hypersomnia - онлайн-шутер с видом сверху, доступный как бесплатное ПО.

Игра разрабатывается как MMO с RPG элементами.

Версии игры доступны для Windows, GNU/Linux и MacOS и имеют небольшой размер загрузки - только 25 МБ.

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

Код
std::weak_ordering

std::weak_ordering — это тип в C++, который введен в стандарте C++20 для использования в контексте трехсторонних операторов сравнения (таких как операторы <=> и ==). Этот тип предоставляет четыре значения: std::weak_ordering::equivalent, std::weak_ordering::less, std::weak_ordering::greater и std::weak_ordering::unordered.

std::weak_ordering используется для сравнения объектов, когда сравнение может быть неоднозначным или невозможным, но при этом необходимо учесть отношение порядка. Например, при сравнении чисел с плавающей точкой, если одно или оба числа являются NaN (Not a Number), то результат сравнения может быть неопределенным. В таких случаях std::weak_ordering может использоваться для предоставления информации о том, являются ли объекты эквивалентными, меньшими, большими или не сравнимыми.

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