seniorcpp | Unsorted

Telegram-канал seniorcpp - Senior C++ Developer

11482

Изучаем C++. По вопросам сотрудничества: @adv_and_pr РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba

Subscribe to a channel

Senior C++ Developer

#вопросы_с_собоседований
В чем различия между delete и delete[]?

delete предназначен для уничтожения объектов, память под которые выделена при помощи new(). delete[] для объектов выделенных при помощи оператора new[]().

При неправильном использовании оператора delete (например, delete вместо delete[]) результат будет: undefined behavior.

Читать полностью…

Senior C++ Developer

Вам нравится читать контент на этом канале?

Возможно, вы задумывались о том, чтобы купить на нем интеграцию?

Следуйте 3 простым шагам, чтобы сделать это:

1) Регистрируйтесь по ссылке: https://telega.in/n/seniorcpp
2) Пополняйтесь удобным способом
3) Размещайте публикацию

Если тематика вашего поста подойдет нашему каналу, мы с удовольствием опубликуем его.

Читать полностью…

Senior C++ Developer

➡️ Модули (Modules) в C++

Модули - это система сборки и организации кода, представленная в C++20.

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

•
Модули заменяют использование препроцессорных директив #include, улучшая время компиляции и предотвращая проблемы с зависимостями и макросами.

•
Модули значительно сокращают время компиляции по сравнению с традиционными заголовочными файлами, так как они компилируются только один раз.

•
Модули предотвращают проблемы, связанные с макросами и конфликтами имен, поскольку они предоставляют четкие границы и изолированные области видимости.

•
Модули упрощают управление зависимостями и организацию кода, что делает проекты более поддерживаемыми и масштабируемыми.

Читать полностью…

Senior C++ Developer

➡️ Диапазоны и итераторы в C++

• В C++ стандартная библиотека шаблонов (STL) предоставляет мощные инструменты для работы с коллекциями данных.

• Диапазоны и итераторы позволяют вам легко и эффективно перебирать элементы контейнеров, таких как векторы, списки и множества.

• Использование диапазонов и итераторов делает код более чистым и читаемым, упрощает операции перебора и модификации элементов контейнеров.

Читать полностью…

Senior C++ Developer

«Привет, как дела?» — сразу летишь во френдзону

Это будет продолжаться ВЕЧНО, пока не начнешь читать канал ТВОРЧЕСТВО ЧУВСТВ, где узнаешь:

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


Главное про качественные отношения тут: t.me/+2PeNv_5pb8djMDdi

Читать полностью…

Senior C++ Developer

Оптимизируем до последней капли: cache-friendly код на C++

❓Хотите узнать, как «выжимать» последние проценты скорости в программе на C++?

⏰ Ждем вас на открытом вебинаре 4 сентября в 20:00 мск, где мы разберем:

- как реализовать доступ к оперативной памяти (ОП) в современных системах;
- «плохие» и «хорошие» паттерны доступа к ОП;
- как писать дружелюбный к кэшу код на C++.

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

🔥 Спикер Андрей Рыжиков — разработчик в НИИ обработки аэрокосмических изображений.

Встречаемся в преддверии старта курса «Специализация C++ Developer». Все участники вебинара получат специальную цену на обучение!

👉Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cA5wnO

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

Читать полностью…

Senior C++ Developer

➡️ Циклы for по диапазону

• Синтаксический сахар для перебора элементов контейнера.

std::array<int, 5> a {1, 2, 3, 4, 5};
for (int& x : a) x *= 2;
// a == { 2, 4, 6, 8, 10 }


•
Обратите внимание на разницу при использовании int в противовес int&:

std::array<int, 5> a {1, 2, 3, 4, 5};
for (int x : a) x *= 2;
// a == { 1, 2, 3, 4, 5 }

Читать полностью…

Senior C++ Developer

➡️ Использование static_assert для компиляционных проверок

static_assert — это мощный инструмент в C++, который позволяет проверять условия на этапе компиляции.

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

C++ Learning 👩‍💻

Читать полностью…

Senior C++ Developer

➡️ Использование SFINAE для селективной компиляции функций

SFINAE (Substitution Failure Is Not An Error) — это одна из самых мощных и менее известных техник в C++, которая позволяет выбирать, какие функции должны быть скомпилированы, на основе доступности определенных типов или выражений.

• SFINAE позволяет автоматически исключать функции из компиляции, если параметры или выражения не соответствуют определенным условиям. Это достигается с помощью специальных инструментов, таких как std::enable_if.

• В примере выше используются std::enable_if_t и std::is_integral_v для выбора функции, которая будет скомпилирована, на основе типа передаваемого аргумента.

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

Читать полностью…

Senior C++ Developer

➡️ Оператор decltype для создания зависимых типов в C++

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

• Оператор decltype определяет тип sum на основе типа элементов, возвращаемых итератором контейнера. Это позволяет избежать жесткого кодирования типов и делает код более гибким.

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

Читать полностью…

Senior C++ Developer

➡️ Ленивая инициализация статического объекта с использованием std::call_once

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

🗣️ Для этого можно использовать std::call_once.

Читать полностью…

Senior C++ Developer

➡️ Расширение возможностей с помощью итераторов-адаптеров

Итераторы-адаптеры - это классы, которые оборачивают стандартные итераторы и предоставляют дополнительные возможности или изменяют их поведение.

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

Читать полностью…

Senior C++ Developer

➡️ Строго типизированные перечисления

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

Читать полностью…

Senior C++ Developer

➡️ Злой друг программиста: переопределение ключевых слов

• Переопределение ключевых слов — плохая практика программирования, но это возможно через препроцессор. Это может вводить баги, например, #define true false или #define else.

#define int float
#define float char


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

#define public private
#include "mylibrary.h"
#undef private


• Это позволяет управлять доступом к библиотеке без её изменения, но требует осторожности.

Читать полностью…

Senior C++ Developer

➡️ Размещающий new

• Размещающий new - это альтернативный синтаксис для оператора new, который размещает объект в уже выделенной памяти. Он используется для настройки vtable и вызова конструктора.

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

Читать полностью…

Senior C++ Developer

Snake – искусственный интеллект для игры «Змейка»

Цель змеи – постоянно есть пищу и как можно скорее заполнить карту своим телом

Первоначально проект был написан на C++. Теперь он был переписан на Python с удобным графическим интерфейсом для пользователя

https://github.com/chuyangliu/snake

Читать полностью…

Senior C++ Developer

➡️ auto & decltype

• auto-типизированные переменные выводятся компилятором на основе типа их инициализатора.
• Чрезвычайно полезно с точки зрения удобочитаемости, особенно для сложных типов:

// std::vector<int>::const_iterator cit = v.cbegin();
auto cit = v.cbegin(); // альтернатива

// std::shared_ptr<vector<uint32_t>> demo_ptr(new vector<uint32_t>(0);
auto demo_ptr = make_shared<vector<uint32_t>>(0); // альтернатива


• Функции также могут выводить тип возвращаемого значения с помощью auto. В C++11 тип возвращаемого значения должен быть указан либо явно, либо с помощью decltype, например:

template <typename X, typename Y>
auto add(X x, Y y) -> decltype(x + y)
{
return x + y;
}
add(1, 2); // == 3
add(1, 2.0); // == 3.0
add(1.5, 1.5); // == 3.0


• Приведенная выше форма определения возвращаемого типа называется trailing return type, т.е. -> return-type.

Читать полностью…

Senior C++ Developer

➡️ Концепты (Concepts) в C++

Концепты - это новая возможность в C++20, которая позволяет задавать ограничения на шаблонные параметры. Это позволяет писать более безопасный и читаемый код, поскольку компилятор проверяет соответствие типов требованиям концептов на этапе компиляции.

• template<typename T> concept Arithmetic = std::is_arithmetic_v<T>; определяет концепт Arithmetic, который ограничивает типы, для которых значение std::is_arithmetic_v<T> истинно (т.е. типы, которые являются арифметическими).

• template<Arithmetic T> T add(const T& a, const T& b) определяет шаблонную функцию add, которая будет компилироваться только для типов, удовлетворяющих концепту Arithmetic.
Использование функции add:

• Примеры с целыми числами и числами с плавающей запятой успешно вызывают функцию add.

•
Пример со строками (закомментированный) вызовет ошибку компиляции, так как std::string не является арифметическим типом.

Читать полностью…

Senior C++ Developer

➡️ Делегирование конструкторов

• В старом C++ вам нужно создавать функцию-член для инициализации и вызывать ее из всех конструкторов для достижения универсально инициализации.

• Но начиная с C++11 конструкторы теперь могут вызывать другие конструкторы из того же класса с помощью списка инициализаторов.

Читать полностью…

Senior C++ Developer

➡️ Удаленные и дефолтные функции

struct demo
{
demo() = default;
};

demo d;


• У вас вполне закономерно может возникнуть вопрос, зачем вам писать 8+ букв (т.е. = default;), когда можно просто использовать {}, т.е. пустой конструктор? Никто вас не останавливает. Но подумай о конструкторе копирования, операторе копирования присваиванием, и т.д.

• Пустой конструктор копирования, например, не то же самое, что конструктор копирования по умолчанию (который будет выполнять почленную копию всех членов).

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

class demo
{
int m_x;

public:
demo(int x) : m_x(x){};
demo(const demo &) = delete;
demo &operator=(const demo &) = delete;
};

demo obj1{123};
demo obj2 = obj1; // ОШИБКА -- вызов удаленного конструктора копирования
obj2 = obj1; // ОШИБКА -- оператор = удален


🗣️ В старом С++ вы должны были сделать его приватным. Но теперь в вашем распоряжении есть директива компилятора delete.

Читать полностью…

Senior C++ Developer

➡️ Универсальные ссылки

• В официальной терминологии известные как forwarding references (передаваемые ссылки). Универсальная ссылка объявляется с помощью синтаксиса Т&&, где Т является шаблонным параметром типа, или с помощью auto&&. Они в свою очередь служат фундаментом для двух других крупных фич:

• move-семантика
• И perfect forwarding, возможность передавать аргументы, которые являются либо lvalue, либо rvalue.

Универсальные ссылки позволяют ссылаться на привязку либо к lvalue, либо к rvalue в зависимости от типа. Универсальные ссылки следуют правилам свертывания ссылок:

1. T& & становится T&
2. T& && становится T&
3. T&& & становится T&
4. T&& && становится T&&

Читать полностью…

Senior C++ Developer

➡️ Приведение типов

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

struct demo
{
explicit operator bool() const { return true; }
};

demo d;
if (d); // OK, вызывает demo::operator bool()
bool b_d = d; // ОШИБКА: не может преобразовать 'demo' в 'bool' во время инициализации
bool b_d = static_cast<bool>(d); // OK, явное преобразование, вы знаете, что делаете

Читать полностью…

Senior C++ Developer

Курс «Реверсивный инжиниринг ПО под ОС Windows» стартует 9 сентября!

В курсе подробно рассматривается синтаксис Ассемблера, анализ приложений различного уровня сложности, от простейших crackme до полноценных программ на современных архитектурах.
Необходимые знания: язык Ассемблера, С/С++, python, навыки работы с IDA и другими инструментами для реверса

Вы получите:
- Сертификат/удостоверение о повышении квалификации
- Сопровождение и поддержку Академии Кодебай
- Возможности трудоустройства/стажировки

Пишите нам @Codeby_Academy

Подробнее о курсе → здесь

Читать полностью…

Senior C++ Developer

🔴 18 сентября состоится крупнейшая конференция по трафику и продажам в Телеге

1⃣2⃣3⃣4⃣5⃣

Вам однозначно стоит быть, если:

— Работаете с трафиком из Telegram Ads или посевов;
— Продаете свои услуги через Telegram;
— Еще не зарабатываете в TG, но планируете;

📣 Вот лишь некоторые из спикеров:

— Алексей Соловьев (Event and Community Manager at TON)
— Дмитрий Форман (Digital-Директор Самолет)
— Марат Шайхетдинов (Founder TgConf & Clickise)
— Ирина Нумизматка (Автор крупнейшего блога про Telegram Ads)
— Глеб Яскевич (Директор по маркетингу Getcourse)
— Артур Халиуллин (Сеть каналов на 1млн+ подписчиков)
— Влад Силантьев (С нуля дошел до 63 проектов в Telegram Ads)
— Павел Калюканов (Product Manager TgStat)
и множество других не менее интересных спикеров

🕔 Дата и время: 18 сентября в 9:00
📍 Место проведения: Main Stage, Москва

А в заключении мероприятия пройдет Aftertparty для VIP-участников и спикеров с хедлайнером, которого все знают!

🎟 Приобрести билет до повышения цен
Промокод telegapart дает скидку 10% на все билеты

Читать полностью…

Senior C++ Developer

➡️ Обнаружение утечек памяти с использованием нестандартного оператора new в C++

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

• Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map.

• Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations.

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

Читать полностью…

Senior C++ Developer

➡️ Функции в качестве параметра шаблона

• Параметром шаблона могут быть конкретные целые числа.

• Параметром шаблона также могут быть конкретные функции.

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

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

• Старое сохранённое значение аргумента берётся из кеша.

Читать полностью…

Senior C++ Developer

➡️ Наследование с помощью private и public

• Использование private и public при наследовании в C++ позволяет контролировать доступ к членам базового класса в производных классах.

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

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

C++ Learning 👩‍💻

Читать полностью…

Senior C++ Developer

➡️ Lambda-функции и их использование

Lambda-функции — это мощный инструмент в C++, позволяющий определять анонимные функции прямо в месте их использования.

• Они особенно полезны для создания компактного и читаемого кода, например, при работе с алгоритмами из стандартной библиотеки (STL).

Читать полностью…

Senior C++ Developer

Рассказываем, как прошла C++ Zero Cost Conf - конференция по прикладному C++

На сцене выступили с докладами 14 спикеров из разных компаний, в том числе:

🔸 Антон Полухин, руководитель группы разработки общих компонент Яндекс Go. Поделился свежими новостями от Российской рабочей группы по стандартизации С++

🔸 Андрей Аксёнов, руководитель разработки инфраструктуры поиска Авито/Sphinx. Рассказал, как парсить гигабайты в секунду

🔸 Василий Куликов, ведущий разработчик в Яндексе. Рассмотрел основные проблемы реализации примитивов синхронизации во фреймворке userver

🔸 Константин Владимиров, руководитель отдела компиляторов и средств разработки в Syntacore. Рассказал об интересных C++-решениях в генераторе llvm-snippy

🔸 Вадим Белотицкий, руководитель разработки сервиса «Межгород» Яндекс Такси. Провёл квиз «Геогессинг». Зрители угадывали локации, в которых расположены сервисы Яндекса

Не обошлось без активностей за пределами основной сцены. Расставили большие доски с примерами неработающего кода, а участники пытались понять, где кроется ошибка и как её исправить. А ещё была целая зона настолок от инженеров Яндекса: на выбор «Гусиус», «IT-крокодил», «Угадай кто» и «IT’s Доббль».

📹 Все выступления спикеров собрали в плейлист. Посмотреть его можно [в VK Видео] или [на ютуб-канале].

Читать полностью…

Senior C++ Developer

➡️ Ответвление с использованием декларации переменной

C++ включает синтаксическое сокращение для одновременного объявления переменной и разветвления по её значению.

• Это выглядит как декларация переменной внутри условия оператора if или while, и одновременное присваивание ей значения.

Читать полностью…
Subscribe to a channel