Ссылки и указатели в C++: от основ к безопасности и современному коду
Реклама. ООО «ЛитРес», ИНН: 7719571260.
Оглавление
Группа авторов. Ссылки и указатели в C++: от основ к безопасности и современному коду
Глава 1
Где что живёт стек, куча, статика и другие сегменты памяти
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ДОПОЛНЕНИЕ
ВОДА
Игнорирование сегментов памяти и ручное управление без осторожности
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Осознанное размещение, RAII и современные инструменты
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Статическая память вечные жители программы
НА ЗАМЕТКУ
ПРИМЕЧАНИ
ВАЖНО
ДОПОЛНЕНИЕ
ВОДА
Злоупотребление статикой и глобальными
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Минимизация статики, const и alternatives
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Константная память неизменяемые сокровища
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ДОПОЛНЕНИЕ
ВОДА
Попытки модификации констант и игнор RO
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Использование
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Виртуальная память контекст для реального мира
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ДОПОЛНЕНИЕ
ВОДА
Зависимость от виртуальной памяти без лимитов и понимания
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Мониторинг, лимиты и осознанное использование
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Жизненный цикл переменных от рождения до смерти
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
Продление жизни неправильно
Правильные scopes и RAII
Выравнивание и alignof, sizeof vs реальный размер
ДОПОЛНЕНИЕ
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ВОДА
Игнорирование выравнивания, padding и alignof
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ВОДА
Оптимизация с alignof, alignas и умным дизайном
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ДОПОЛНЕНИЕ
sizeof vs реальный размер почему компилятор "обманывает" нас байтами
ДОПОЛНЕНИЕ
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ВОДА
Предположение, что sizeof = сумма полей, и игнорирование "реального" размера
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ВОДА
Проверка sizeof, оптимизация и расчёт "реального" размера
НА ЗАМЕТКУ
ПРИМЕЧАНИЕ
ВАЖНО
ДОПОЛНЕНИЕ
Упражнения: &, sizeof, alignof
Задача 1: Адрес переменной на стеке
Задача 2: Размер простого типа
Задача 3: Выравнивание базового типа
Задача 4: Адрес элемента массива
Задача 5: Размер структуры с padding
Задача 6: Выравнивание структуры
Задача 7: Адрес глобальной переменной
Задача 8: Размер массива vs указателя
Задача 9: Выравнивание с alignas
Задача 10: Адрес в функции
Задача 11: Размер класса с виртуальными функциями
Задача 12: Выравнивание массива
Задача 13: Адрес на куче
Задача 14: Размер union
Задача 15: Выравнивание bit-field
Задача 16: Сравнение адресов
Задача 17: Размер с packed
Задача 18: Выравнивание over-aligned
Задача 19: Адрес строки
Задача 20: Комбинированная: sizeof, alignof, &
Резюме
Ответы на задачи
Ответы Глава 1. Память: стек, куча, статика
Ответ на задачу 1 (Адрес переменной на стеке)
Ответ на задачу 2 (Размер простого типа)
Ответ на задачу 3 (Выравнивание базового типа)
Ответ на задачу 4 (Адрес элемента массива)
Ответ на задачу 5 (Размер структуры с padding)
Ответ на задачу 6 (Выравнивание структуры)
Ответ на задачу 7 (Адрес глобальной переменной)
Ответ на задачу 8 (Размер массива vs указателя)
Ответ на задачу 9 (Выравнивание с alignas)
Ответ на задачу 10 (Адрес в функции)
Ответ на задачу 11 (Размер класса с виртуальными функциями)
Ответ на задачу 12 (Выравнивание массива)
Ответ на задачу 13 (Адрес на куче)
Ответ на задачу 14 (Размер union)
Ответ на задачу 15 (Выравнивание bit-field)
Ответ на задачу 16 (Сравнение адресов)
Ответ на задачу 17 (Размер с packed)
Ответ на задачу 18 (Выравнивание over-aligned)
Ответ на задачу 19 (Адрес строки)
Ответ на задачу 20 (Комбинированная: sizeof, alignof, &)
Отрывок из книги
В C++ память делится на несколько сегментов, каждый из которых предназначен для хранения данных с разными сроками жизни, правилами доступа и механизмами управления. Это как комнаты в огромном доме: кухня для быстрых дел (стек), подвал для долгосрочного хранения (куча), фундамент для постоянных элементов (статика), библиотека для неизменных книг (константная память) и чертежи дома (сегмент кода). Понимание этих сегментов ключ к избежанию ошибок, как крахи или утечки.
Стек (Stack): это область для локальных переменных функций, параметров и информации о вызовах (стек вызовов). Работает по принципу LIFO (Last In, First Out) как стопка тарелок: последняя положенная снимается первой. Размер стека фиксирован и ограничен (обычно 1–8 МБ на поток), выделяется автоматически при входе в функцию и освобождается при выходе. Это делает стек сверхбыстрым, но не подходящим для больших или динамических данных рискуете переполнением (stack overflow). Локальные переменные "живут" только внутри функции.
.....
int main() {
auto ptr = heapExample(); // Безопасно, ptr владеет памятью
.....