🏗 Тетрис в памяти: Почему порядок полей в классе важен? Вы создали простую структуру: bool, int и еще один bool. Математика проста: 1 байт + 4 байта + 1 байт = 6 байт. Вы проверяете через sizeof и видите... 12 байт. 🤯 Куда делись еще 6 байт? Вы только что потеряли 50% памяти на "воздух". Это называется Padding (Выравнивание). ⚙️ Как это работает? Процессор не любит читать данные по произвольным адресам. Ему удобно читать кусками по 4 или 8 байт (слова). Чтобы int (4 байта) не "разломился" посе...
C++ geek
Учим C/C++ на примерах
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20✂️ C++17: Перестаньте копировать строки! (std::string_view) Мы привыкли передавать строки в функции по константной ссылке: const std::string&. Нам кажется, что это эффективно, ведь мы не копируем объект, верно? Не всегда. 🛑 Если вы передаете в такую функцию обычный текст в кавычках (строковый литерал) или часть другой строки, C++ втайне от вас создаст временный объект std::string, выделит память в куче (heap allocation), скопирует туда данные и только потом передаст ссылку. Решение? std::string...
🪄 Магия std::string: Почему короткие строки работают быстрее? (SSO) Многие думают, что std::string - это всегда: 1. Выделение памяти в куче (new / malloc). 2. Копирование данных туда. 3. Освобождение памяти (delete) в деструкторе. Это медленно. Но если вы создадите строку "Hello", никаких аллокаций не произойдет. Почему? Благодаря Small String Optimization (SSO). ⚙️ Как это работает? Стандартная строка (на 64-битной системе) обычно занимает 24 или 32 байта (размер самой структуры sizeof(std::st...
🏗 Анатомия std::vector: Что происходит, когда место заканчивается? std::vector - самый популярный контейнер в C++. Мы просто пишем push_back, и магия работает. Но что происходит «под капотом», когда вы пытаетесь добавить элемент, а свободное место (capacity) закончилось? Происходит Реаллокация. И это гораздо дороже, чем просто добавление числа. ⚙️ Сценарий катастрофы (пошагово): Допустим, у вектора было место под 4 элемента, и оно занято. Вы добавляете 5-й. 1. Поиск новой земли: Вектор понимает...
🔒 const в C++: Скрытый смысл, о котором молчат Мы привыкли думать, что const после имени метода это просто защита от дурака: "Я обещаю не менять поля класса внутри этой функции". Но в современном C++ (и в стандартной библиотеке STL) const означает нечто большее. Это контракт потокобезопасности (Thread Safety Contract). 🧵 Золотое правило STL: 1. const методы можно вызывать из разных потоков одновременно без блокировок. (Safe for concurrent reads). 2. Не-const методы требуют внешней синхронизаци...
😱 std::vector<bool>: Великий обман C++ Вы думаете, что std::vector<bool> это просто вектор, который хранит булевы значения? Нет. Это совершенно уникальный монстр, который нарушает правила стандартной библиотеки. 📉 В чем подвох? Обычный bool занимает 1 байт (минимум адресуемой памяти). Но создатели C++ решили сэкономить память. std::vector<bool> - это специализация. Внутри него каждый bool занимает всего 1 бит. В одном байте хранится сразу 8 значений true/false. Экономия памяти в 8 раз! Круто? ...
🏗 Анатомия std::vector::push_back: Когда память заканчивается Мы все любим push_back. Это удобно: просто кидаешь данные в вектор, а он сам разбирается с памятью. Но что происходит, когда вы добавляете элемент, а место (capacity) закончилось? Происходит Реаллокация (Reallocation). И это дорогая операция. ⚙️ Что происходит «под капотом»? 1. Поиск новой земли: Вектор понимает, что текущий буфер полон. Он просит у операционной системы выделить новый блок памяти. Обычно он в 1.5 или 2 раза больше пр...
🏗 Что на самом деле происходит, когда std::vector «лопается»? Мы все любим push_back. Это удобно: кидаешь данные в вектор, а он сам разбирается с памятью. Но что происходит, когда вы добавляете элемент, а capacity (вместимость) вектора закончилась? Происходит Реаллокация (Reallocation). И это гораздо дороже, чем кажется. ⚙️ Алгоритм катастрофы: 1. Поиск новой земли: Вектор понимает, что места нет. Он обращается к оперативной памяти и просит выделить новый блок памяти. Обычно он в 1.5 или 2 раза...
🗺 std::map или std::unordered_map: Битва за кэш Когда нам нужно хранить пары «Ключ - Значение», рука сама тянется написать std::map. Это стандарт, это удобно, это сортировка из коробки. Но с точки зрения производительности std::map это часто худший выбор. Почему? 🌲 1. std::map - Это Дерево (Red-Black Tree) Каждый элемент в map - это отдельный узел (Node), выделенный в куче (new). Узлы разбросаны по памяти хаотично. • Чтобы найти элемент, процессор прыгает по указателям: Root -> Left -> Right -...
📦 std::move vs std::forward: Когда и зачем? На собеседованиях часто спрашивают про rvalue-ссылки, но в реальном коде мы постоянно путаемся: когда делать move, а когда forward? Давайте разберем на жизненных примерах. 1. std::move - "Это мое, но забирай!" 🚚 std::move - это безусловное приведение к rvalue. Вы говорите компилятору: "Мне этот объект больше не нужен. Можешь выпотрошить его и забрать данные, не копируя их". Сценарий 1: Передача владения (unique_ptr) Это классика. std::unique_ptr нель...