C++

Содержание

Вокабуляр

Ссылки

Указатели и динамическая память

Вокабуляр

виртуальное адресное пространство (virtual address space)

виртуальная память (virtual memory)

единый синтаксис инициализации (uniform initialization syntax)

{ }

заявленный тип (declared type)

decltype

инициализация переменной (variable initialization)

куча, хип, свободная память (heap, free store)

локальная память тредов (thread local storage)

оператор вставки в поток (stream insertion operator)

<<

оператор разрешения области видимости (scope resolution operator)

::

приведение (casting)

принужденное приведение (coercing)

присваивание (значения переменной) (variable assignment)

фрейм аппаратной памяти physical memory frame

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

список инициализации (initializer list)

{ }

статическая память (static storage)

стек (stack)

стековый фрейм (stack frame)

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

страница памяти (memory page)

Фиксированный блок виртуального адресного пространства

сужающее преобразование (narrowing conversion)

Преобразование величины одного типа, в величину другого типа, имеющего меньший размер, чем исходный тип.

Указатели и динамическая память

Важные вопросы

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

Память в программах C++ разделена на две части — стек и свободная память. Стек состоит из стековых фреймов. Текущая выполняемая функция размещается в верхнем стековом фрейме. В памяти, выделенной под верхний стековый фрейм, хранятся аргументы и локальные переменные текущей выполняемой функции. Если текущая функция вызывает другую функцию, то создается другой стековый фрейм, размещаемый поверх текущего. Аргументы, переданные текущей функцией в вызываемую функцию, копируются в память, выделенную под вновь созданный стековый фрейм.

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

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

Память, выделенная в свободном пространстве, не высвобождается автоматически. Высвобождение должно осуществляться вручную. Однако, существует механизм, так называемых „умных указателей“ (smart pointers), с помощью которых можно устранить необходимость ручного высвобождения памяти в свободном пространстве.

Современные операционные системы являются системами с виртуальной памятью.

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

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

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

Стек и хип являются двумя наиболее важными частями памяти в программах C++. Помимо данных частей существуют также статическая память и локальная память тредов.

Стек и хип размещаются в виртуальном адресном пространстве процесса.

Стек — это место, где размещаются локальные переменные и аргументы функций.

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

Каждый тред имеет свой собственный стек. Поэтому стековая память является потокобезопасной.

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

Хип и стек находятся на противоположных сторонах адресного пространства процесса. Хип начинается с низкого адреса и расширяется в сторону более высокого адреса. Стек, напротив, начинается с более высокого адреса и увеличивается в сторону более низкого.

+------+
| Стек |
+------+
|   ↓  |
|      |
|   ↑  |
+------+
| Куча |
+------+

Ссылки