C++ • STL Internals • Move Semantics • Memory Layout • Vector Implementation
Учебный проект, демонстрирующий реализацию собственного вектора (SimpleVector)
с поддержкой move-семантики, строгих и базовых гарантий исключений
и наглядной визуализацией работы памяти.
Проект создан для глубокого понимания:
- как устроен
std::vectorвнутри, - зачем нужны
move ctor / move assign, - когда происходит
realloc, - как элементы физически «переезжают» в памяти при
Insert/Erase.
.
├── README.md # README.md
├── simple_vector/
│ ├── array_ptr.h # RAII-обёртка над динамическим массивом
│ ├── simple_vector.h # Реализация SimpleVector
│ ├── tests_move_visual.h # Визуальные демо move-семантики
│ ├── main_visual.cpp # Интерактивный запуск визуальных демо
│ └── main.cpp # Обычный запуск тестов (assert-based)
└── docs/
├── visual_demo_E_explained.md # Подробный разбор режима E
└── windows_run_log.txt # Полный вывод запуска на Windows (UTF-8, chcp 65001)
- RAII-владение
T[] - ❌ копирование запрещено (защита от double delete)
- ✅ перемещение O(1)
- используется для строгой гарантии исключений
- безопасное перевыделение памяти в контейнере
Собственная реализация вектора с поддержкой:
- move-конструктора и move-оператора присваивания
- работы с некопируемыми (move-only) типами
PushBack,Insert,Erase,Resize,Reserve- поведения, максимально близкого к
std::vector
Интерактивный визуализатор показывает реальное поведение памяти.
| Режим | Что демонстрирует |
|---|---|
| A | move ctor / assign — буфер переезжает (O(1)) |
| B | realloc — смена адреса буфера при росте capacity |
| C | move-only элементы (TraceX), видны вызовы move |
| D | все режимы подряд |
| E | 🔥 адрес каждого элемента &v[i] до/после Insert/Erase |
После каждого прогона можно:
- выбрать другой режим,
- либо выйти (
Q/X).
g++ -std=c++17 -O2 -Wall -Wextra main_visual.cpp -o visual
Запуск
./visual
или сразу с указанием режима:
./visual A
./visual B
./visual C
./visual D
./visual E
🪟 Windows (UTF-8 + эмодзи) Чтобы русский текст и эмодзи корректно отображались в консоли:
chcp 65001
g++ -std=c++17 -O2 -Wall -Wextra main_visual.cpp -o visual
visual
📌 Пример вывода (режим E)
Введите A/B/C/D/E: E
🧪 E) SimpleVector — SLOTS: адрес каждого &v[i] до/после Insert/Erase
📦 v(initial) | size=6 cap=8 | [ 0 1 2 3 4 5 ]
🧠 Insert idx=2 value=99
✅ REALLOC не было → адреса слотов те же, значения сдвинулись
🧠 Erase idx=1
✅ container valid
➡️ Подробный построчный разбор с реальными адресами памяти смотри в файле:
docs/visual_demo_E_explained.md
🎓 Назначение проекта
Проект подходит для:
изучения move-семантики C++,
понимания устройства STL-контейнеров,
подготовки к собеседованиям,
обучения наглядно, «по адресам и памяти».
🏁 Итог
Этот репозиторий — не просто код, а интерактивный учебный стенд, позволяющий увидеть, что именно происходит в памяти при работе вектора.
Если понимаешь этот проект —> std::vector больше не чёрный ящик 😉