C++ время выполнения (косвенно) с помощью Operating System примитивов измените virtual address spaceprocess, управляя вашей программой.
Подробнее о computer architecture, CPU modes, operating systems, OS kernels, system calls, instruction sets, machine code, object code, linkers, relocation, name mangling, compilers, virtual memory.
В моей системе Linux, new
(при условии стандартной библиотеки C++), как правило, построены выше malloc(3) (при условии стандартной библиотеки C), который может называть mmap(2) системный вызов (реализованный в ядре), который изменяет виртуальное адресное пространство (имея дело с MMU). И delete
(из стандартной библиотеки C++), как правило, построено выше free(3), которое может позвонить по номеру munmap(2), который изменяет виртуальное адресное пространство.
вещи гораздо более сложным в деталях:
new
называет конструктор после выделенной памяти с malloc
delete
звонит деструктор, прежде чем рилизинг памяти с free
free
обычно отмечают освобожденную зону памяти как многоразовую в будущем malloc
(поэтому обычно не освободить память с munmap
)
так malloc
, как правило, повторно использует предварительно освобожденную зону памяти до запроса более адресного пространства (с использованием mmap
) из ядра
для массива new[]
и delete[]
, зона памяти содержит размер массива, и конструктор (new[]
) или деструктор (delete[]
) вызывается в цикле
технически, когда вы код SomeClass*p = new SomeClass(12);
память первой выделяется с помощью ::operator new
(который вызывает malloc
), а затем конструктор SomeClass
вызывается с 12 в качестве аргумента
когда код delete p;
, деструктор SomeClass
называется, а затем память освобождается с помощью ::operator delete
(который называет free
)
BTW, система Linux состоит из free software, поэтому я настоятельно рекомендую вам установить некоторое распределение Linux на вашей машине и использовать его. Таким образом, вы можете изучить исходный код из libstdc++
(стандартная библиотека C++, которая является частью исходного кода компилятора GCC, но связана вашей программой), libc
(стандартная библиотека C) ядра. Вы также можете использовать strace(1) свою программу и процесс на C++, чтобы понять, что делает system calls.
При использовании GCC, вы можете получить сгенерированный код ассемблера при компиляции исходного файла foo.cc
C++ с g++ -Wall -O -fverbose-asm -S foo.cc
, который производит файл foo.s
ассемблера. Вы также можете получить текстовый вид промежуточного Gimple internal representation внутри компилятора с g++ -Wall -O -fdump-tree-gimple -c foo.cc
(вы получите несколько foo.cc.*.gimple
и, возможно, многие другие файлы дампа GCC). Вы даже можете найти что-то в представлении Gimple, используя инструмент GCC MELT (я разработал и реализовал большую часть его; useg++ -fplugin=melt -fplugin-arg-melt-mode=findgimple
).
Стандартная библиотека C++ имеет внутренние инварианты и условные обозначения, а компилятор C++ отвечает за их использование при испускании кода ассемблера. Поэтому компилятор и его стандартная библиотека C++ разрабатываются совместно и написаны в тесном сотрудничестве (а некоторые грязные трюки внутри реализаций библиотек C++ требуют поддержки компилятора, возможно, благодаря встроенным компиляторам и т. Д.). Это не относится к C++: Ocaml также совместно разрабатывает и совместно реализует язык Ocaml и его стандартную библиотеку.
Система времени выполнения C++ имеет концептуально несколько уровней: стандартную библиотеку C++ libstdc++
, стандартную библиотеку C libc
, операционную систему (и в нижней части аппаратного обеспечения, включая MMU). Все это детали реализации, языковой стандарт C++11 на самом деле не упоминает их.
Я думаю, что ваш ответ привел меня к тому, что я хочу понять. Если я правильно понял, есть несколько уровней кода, включая код ядра (Linux, Windows и т. Д.), Который использует mmap func, все эти «коды» на самом деле скомпилированы в «коды» сборки, поэтому процессор может его запустить. Что касается удаления - также после компиляции код уже находится в сборке. Теперь, когда процесс (код) загружается в память, процессор фактически запускает его. ** Теперь, на этом этапе процесса, который уже загружен и запущен ** - кто отвечает за обработку памяти? – StackUser
Вы выглядите смущенным, и вам нужно несколько дней прочитать несколько книг по компьютерной архитектуре, наборам инструкций, разработке операционной системы, компиляторам. Мы не можем объяснить все это на SO в нескольких параграфах. –
Хорошо, можете ли вы дать мне несколько отправных точек, хорошие имена книг, ссылки или конкретные слова для поиска начала? – StackUser