Senior C++ Developer
13.4K subscribers
1.22K photos
3 videos
572 links
№ 4931128893
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr
加入频道
Что нужно дописать, чтобы при вызове конструктора перемещения член класса действительно "переместился"?

Нужно дописать 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 МБ.

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

Код
🥻 Стилизация без границ: создаём бюст в ZBrush!

Стилизация является неотъемлемой частью 3д моделирования. Благодаря ей проекты получают не только выразительность и уникальность, но и оптимизацию и доступность

👉На уроке вы:
- Освоите профессиональные техники в ZBrush
- Создадите уникальный стилизованный бюст
- Научитесь работать с формами и пропорциями
Бесплатный вебинар проходит в рамках курса “3D Artist“

Регистрация и подробнее о курсе 3D Artist - https://otus.pw/w3pr/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
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 может использоваться для предоставления информации о том, являются ли объекты эквивалентными, меньшими, большими или не сравнимыми.

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

Чистая реализация на C++ синтеза изображений на основе стабильной диффузии, включая txt2img, img2img и inpainting.

Github
⭐️ Техножурнал Яндекс 360: рассказываем о технологиях

В Яндекс 360 мы создаём технологии, которые работают в основе более чем 13 сервисов, включая Диск, Почту, Телемост, Мессенджер и другие.

Открывайте Техножурнал, чтобы узнать:

Как мы балансируем нагрузку в 300k RPS в Яндекс Мессенджере,
Как подружили MongoDB и PostgreSQL в Диске,
Какие в команде культура и ценности.

А ещё — как мы внедряли DDD, кто такой Technical Owner, как управляем 650+ шардами PostgreSQL и как подходим к проектированию архитектуры наших сервисов.

⭐️ Всё это — в Техножурнале Яндекс 360.

@yandex360team
Please open Telegram to view this post
VIEW IN TELEGRAM
std::initializer_list

Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, как это можно делать с C-массивами.

Это справедливо и для вложенных контейнеров. Скажите спасибо С++11.
std::search

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

#для_начинающих
Настолки и мерч? Это мы любим.

Го в квиз про Yandex Infrastructure. Это буквально сердце всех технологий и сервисов Яндекса: дата-центры, сети, суперкомпьютеры, базы данных, хранилища, платформа разработки, медиасервисы, CDN и десятки других систем, без которых ничего бы не работало.

Квиз — это не скучный тест, а мини-путешествие по компании. Всё просто: проходите вопросы, узнаёте, как всё устроено — и участвуете в розыгрыше 10 призов: кастомная настолка + фирменный рюкзак.

📍 Сроки проведения конкурса с 26.06.2025г. по 07.07.2025г.

Информация об организаторе, условиях розыгрыша, призах и порядке их получения — по ссылке.
Placement new

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

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

#для_продвинутых
🎮 Место Painter в производстве игр

Стилизация является неотъемлемой частью 3д моделирования. Благодаря ей проекты получают не только выразительность и уникальность, но и оптимизацию и доступность

👉Что вы узнаете:
- Основные этапы производства игр
- Практическую работу в Painter
- Процесс выгрузки и настройки текстур
- Интеграцию готового ассета и созданных текстур в Marmoset

Бесплатный вебинар проходит в рамках курса “3D Artist“

Регистрация и подробнее о курсе 3D Artist - https://otus.pw/r8a6/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Cache miss

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

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

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

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

Преимущества списка инициализации:
— Переменная всегда инициализирована, нет возможности использовать неинициализированную переменную.
— Компилятор может выполнить оптимизации, т. к. знает значение переменной при инициализации.
— При инициализации классов вызываются нужные конструкторы.
— Код становится более читабельным, инициализация видна сразу при объявлении.
#вопросы_с_собеседований
Какая разница между calloc и malloc?

Основное различие между функциями calloc и malloc заключается в том, как они инициализируют выделенную память.

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

Кроме того, в calloc размер выделяемой памяти задается в элементах, а не в байтах. Calloc умножает количество элементов на размер одного элемента, чтобы определить общий размер памяти для выделения.
std::size_t

std::size_t — это тип данных без знака, предназначенный для хранения размера объектов в памяти.
Он определен в заголовочном файле <cstddef> и обычно представлен как unsigned int или unsigned long в зависимости от платформы.

std::size_t используется для:
— Представления индексов массивов и размеров контейнеров в стандартной библиотеке.
— Возврата значений размера из функций, например size(), length().
— Указания размера при выделении памяти.
— Предотвращения переполнения при вычислениях размеров.

std::size_t гарантирует достаточный диапазон значений для адресации всей доступной памяти.
Библиотека концепций

Библиотека концепций (concepts library) — это новая библиотека, добавленная в C++20 для работы с концепциями.

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

Концепции используются для:
— Проверки корректности типов в шаблонах функций и классов.
— Ограничения диапазона допустимых типов.
— Улучшения сообщений об ошибках компиляции.
— Возможности оптимизации кода компилятором.

В примере концепция equality_comparable используется для проверки, что тип T поддерживает операцию ==, необходимую для сортировки. Это позволяет выявить ошибку на этапе компиляции.