Latest posts

C++ geek
17 Sept, 07:29
В чем разница между git fetch и git pull?Разница между этими командами заключается в том, что когда вы используете команду git fetch, Git извлекает последние изменения из удаленного репозитория в ваш локальный репозиторий, но оставляет эти изменения в отдельной ветке git origin.А команда git pull извлекает и интегрирует (скачивает и сливает) последние изменения из удаленного репозитория в вашу текущую ветку работы.📲 Мы в MAX➡️ @cpp_geek


C++ geek
15 Sept, 05:55
std::tiestd::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore.Она может использоваться для распаковки кортежей или пары значений в отдельные переменные. Например, если у вас есть функция, которая возвращает std::pair или std::tuple, вы можете использовать std::tie, чтобы присвоить значения этого кортежа отдельным переменным.В этом примере мы используем std::tie для распаковки результата вызова set_of_s.insert(value) в две переменные: итератор iter и логическую переменную inserted. Это позволяет нам проверить, было ли значение успешно вставлено в набор.📲 Мы в MAX➡️ @cpp_geek


C++ geek
11 Sept, 03:56
move constructorMove-конструктор — это специальный конструктор, который позволяет эффективно перемещать ресурсы из одного объекта в другой, без необходимости копирования данных. Он используется для реализации семантики перемещения (move semantics) и оптимизации работы с временными объектами.Move-конструктор принимает rvalue ссылку (&&) на объект, который будет перемещен, и выполняет простое копирование указателей на данные, а не их фактическое копирование.Использование move-конструктора позволяет избежать лишних копирований данных и повысить производительность при работе с большими или ресурсоемкими объектами.📲 Мы в MAX➡️ @cpp_geek


C++ geek
9 Sept, 05:31
Move-only объекты и почему std::unique_ptr нельзя копироватьМногие удивляются, когда компилятор ругается: «unique_ptr не имеет конструктора копирования». Это не баг, а фича: он move-only. Логика простая: владелец ресурса должен быть только один.#include <memory> #include <iostream>int main() { std::unique_ptr<int> p1 = std::make_unique<int>(42);// std::unique_ptr<int> p2 = p1; // ❌ ошибка копированияstd::unique_ptr<int> p2 = std::move(p1); // ✅ перенос std::cout << p2 << "\n"; // 42 std::cout << (p1 ? "not null" : "null") << "\n"; // null }Ключевой момент: после std::move старый указатель «обнуляется», чтобы избежать двойного освобождения памяти.Если нужен shareable ресурс – используйте std::shared_ptr. Но помните: это дороже (счётчик ссылок, атомики).
C++ geek
7 Sept, 07:34
Генерируем пароли с помощью C++Эта программа создает константы для допустимых символов в пароле и для длины пароля. Затем она инициализирует генератор случайных чисел и генерирует пять случайных паролей.Каждый пароль формируется путем выбора случайного символа из всего набора символов. Этот процесс повторяется до достижения желаемой длины пароля.📲 Мы в MAX➡️ @cpp_geek


C++ geek
31 Aug, 06:04
Сейчас покажу вам простой, но мощный приём для ускорения компиляции - разделение объявления и реализации шаблонов с использованием explicit instantiation.Все мы знаем, что шаблоны в C++ реализуются в заголовочных файлах. Это значит, что каждый .cpp файл, который включает такой заголовок, заново инстанцирует шаблон. Результат - долгое время компиляции и раздутый бинарник.🔧 Что можно сделать?Разделяем интерфейс и реализацию:// MyTemplate.hpp #pragma oncetemplate<typename T> class MyTemplate { public: void doSomething(); };// MyTemplate.cpp #include "MyTemplate.hpp" #include <iostream>
C++ geek
26 Aug, 05:14
Что такое виртуальный деструктор и зачем он используется в C++?В C++ виртуальный деструктор используется для правильного освобождения памяти при удалении объекта через указатель на базовый класс. Если базовый класс имеет виртуальный деструктор, то при удалении объекта через указатель на базовый класс будет вызван деструктор не только базового класса, но и всех его производных классов. Это позволяет избежать утечек памяти и неопределенного поведения при работе с полиморфными объектами.Если виртуального деструктора не объявлено в базовом классе, то при удалении производного объекта через указатель на базовый класс будут вызваны только деструкторы базового класса, что может привести к утечкам памяти и неопределенному поведению.📲 Мы в MAX➡️ @cpp_geek
C++ geek
24 Aug, 07:23
🧵 Сегодня покажу вам, как удобно логгировать значения в отладке с помощью макроса, который реально упрощает жизнь.Когда мы отлаживаем код, часто хочется быстро вывести значения переменных. Писать std::cout << "x: " << x << std::endl; каждый раз — боль. Давайте упростим:#include <iostream>#define LOG(var) std::cout << #var << " = " << (var) << std::endl;int main() { int x = 42; double pi = 3.1415;LOG(x); // x = 42 LOG(pi); // pi = 3.1415 }Фишка в том, что #var превращает имя переменной в строку. А (var) - значение.🔥 Такой макрос отлично заходит при написании алгоритмов, отладки функций, проверки значений — и при этом делает код аккуратнее.
C++ geek
23 Aug, 11:05
🚀 Подборка полезных IT каналов в MaxСистемное администрирование, DevOps 📌https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхакMAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
C++ geek
21 Aug, 07:56
std::move vs std::forward: когда и что использоватьСегодня покажу вам коротко, чем отличаются std::move и std::forward.- std::move(obj) — безусловно превращает объект в rvalue. После этого объект считается "пустым" для повторного использования (в рамках контракта move). Используем, когда мы точно хотим "забрать" ресурсы.- std::forward<T>(obj) — условно делает rvalue, если изначально пришёл rvalue. То есть это "perfect forwarding" для шаблонных функций.Пример:#include <utility> #include <string> #include <iostream>template <typename T> void wrapper(T&& arg) { process(std::forward<T>(arg)); // сохраняет rvalue/lvalue-семантику }void process(const std::string& s) { std::cout << "Lvalue: " << s << '\n'; }
C++ geek
20 Aug, 06:50
Как уменьшить время компиляции C++ проектовСегодня я хочу поговорить про боль, которую мы все знаем — долгую компиляцию больших C++ проектов. Когда проект растёт, время сборки иногда становится просто катастрофическим. Вот несколько приёмов, которые реально помогают:1. PCH (Precompiled Headers) — вынесите редко меняющийся код (например, <iostream>, <vector>, <string>) в precompiled header. Это может срезать время компиляции в разы. 2. Разделяйте код на интерфейсы и реализации — заголовки должны быть минимальными, только объявления. Всё, что можно, уносите в .cpp. 3. Используйте #pragma once вместо include guard — чуть быстрее и проще. 4. Минимизируйте include-цепочки — подключайте в заголовках только то, что реально нужно. Остальное — в .cpp. 5. Инкрементальная сборка — убедитесь, что сборочная система (CMake, Ninja, Make) не пересобирает лишнее.Когда я внедрял эти подходы в одном
C++ geek
19 Aug, 05:32
std::exchange — простой способ менять значения и возвращать старыеВместо того чтобы писать руками:auto old = value; value = new_value; return old;В modern C++ есть готовый инструмент - std::exchange (C++14+).#include <utility> #include <string> #include <iostream>int main() { std::string s = "Hello"; auto old = std::exchange(s, "World");std::cout << "old = " << old << ", s = " << s << '\n'; }
C++ geek
17 Aug, 05:21
Зачем [[nodiscard]] и когда он реально спасает?Сколько раз вы видели: функция возвращает значение, а кто-то его тупо игнорирует. А потом баги из ниоткуда. В C++17 завезли [[nodiscard]], и это реально полезная штука.[[nodiscard]] int compute() { return 42; }int main() { compute(); // warning: ignoring return value }Компилятор предупреждает: "эй, ты вызвал, но не используешь результат". Где это особенно важно:- Функции, которые возвращают ошибки (std::error_code, std::optional, bool успеха операции); - Функции, где пропуск результата ломает логику (например, RAII-объекты, токены отмены, хендлы).Можно навесить [[nodiscard]] и на типы (C++20):
C++ geek
12 Aug, 09:06
Почему std::vector<bool> — это ловушкаЕсли вы думаете, что std::vector<bool> — обычный вектор, только для bool, то… сюрприз! Это не совсем так.Чтобы экономить память, стандартная библиотека делает его специализацией, хранящей биты упакованно. Цена — нетипичное поведение:std::vector<bool> v{true, false, true}; bool p = &v[0]; // Ошибка! Тут нет обычного boolЭлементы vector<bool> — это не настоящие bool, а прокси-объекты. Они ведут себя как bool, но фактически это обёртки над битами. Итог:- нельзя получить указатель на элемент; - работа с ними медленнее, чем с bool; - поведение иногда ломает шаблонный код, который ожидает нормальные ссылки и указатели.Что делать? Если вам нужна коллекция булей — берите std::vector<char> или std::vector<uint8_t>. Памяти уйдёт чуть больше, но всё будет предсказуемо и быстро.std::vector<bool> стоит использовать только если критична экономия
C++ geek
10 Aug, 05:40
RAII — твой лучший друг (и почему не стоит бояться умных указателей)Старый добрый new / delete — это классика, но и источник утечек, крашей и боли. В современном C++ ручное управление памятью почти всегда антипаттерн.Решение — RAII (Resource Acquisition Is Initialization): ресурсы живут ровно столько, сколько объект, который ими владеет. Ушёл объект из области видимости — ресурс освободился.Пример с умными указателями:#include <memory> #include <iostream>struct Foo { Foo() { std::cout << "Init\n"; } ~Foo() { std::cout << "Destroy\n"; } };void bar() { std::unique_ptr<Foo> p = std::make_unique<Foo>(); // RAII // делаем что-то } // тут автоматически вызовется ~Foo()
C++ geek
8 Aug, 12:00
🚀 Подборка полезных IT каналов в MaxСистемное администрирование, DevOps 📌https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхакMAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
C++ geek
5 Aug, 12:38
Move-семантика: где можно ловко сэкономитьМногие знают про std::move, но не всегда используют его там, где это реально ускоряет код. Простой пример — возврат локального объекта из функции:#include <string>std::string make_string() { std::string s = "Hello"; return s; // RVO или move }С C++17 тут почти всегда RVO (Return Value Optimization). Но если RVO невозможен (например, возвращаем тернарный оператор), компилятор применит move:std::string make_string(bool flag) { std::string a = "foo", b = "bar"; return flag ? a : b; // тут будет move }А вот так можно подсказать компилятору явно:
C++ geek
3 Aug, 10:31
Зачем std::move от std::string в emplace_back?Кажется, emplace_back(std::move(str)) — избыточно: ведь emplace_back сам конструирует объект на месте. Но с std::string и другими перемещаемыми типами всё не так просто.Пример:std::vector<std::string> vec; std::string str = "hello";vec.emplace_back(str); // копия vec.emplace_back(std::move(str)); // перемещениеПочему? Потому что:> emplace_back вызывает конструктор std::string(const std::string&), если аргумент — const std::string&, > и std::string(std::string&&), если аргумент — std::string&&.А str — это lvalue. Даже внутри emplace_back. Без std::move, ты просишь вектор скопировать строку. С std::move — переместить.Это относится ко всем emplace_, когда ты передаёшь существующий объект. emplace_back("hello") — другое дело: тут создаётся временный const char, и он уже используется для конструктора string.
C++ geek
31 Jul, 06:02
Что такое ADL и как она может вас подставитьArgument-Dependent Lookup (ADL) — это фича, которая может как упростить код, так и привести к сюрпризам.Представьте:namespace math { struct Vec {};void print(const Vec&) { std::cout << "Vec\n"; } }void foo() { math::Vec v; print(v); // компилятор найдёт math::print через ADL! }Хотя print не в текущем скоупе, компилятор ищет её в namespace аргумента v, т.е. math. Это и есть ADL.
C++ geek
29 Jul, 07:09
std::threadstd::thread является частью стандартной библиотеки C++ и предоставляет возможность создания и управления потоками выполнения. Он позволяет запускать функции в отдельных потоках, обеспечивая параллельное выполнение кода.Обратите внимание, что после создания потока std::thread, вы должны вызвать join() или detach() для корректной обработки завершения потока.В приведенном примере мы использовали join(), чтобы основной поток дождался завершения потока t1. Если вы вызываете join() после завершения потока, программа может выдать исключение или вызвать неопределенное поведение.📲 Мы в MAX➡️ @cpp_geek

Related Channels
Other channels in the same section of the catalogue.
