Динамическое выделение памяти на C, C++ и ассемблере ARM |
![]() |
Добавил(а) microsin |
В этой статье рассматриваются три эквивалентные техники выделения и освобождения динамической памяти в трех средах программирования: язык C, язык C++ и язык ассемблера ARM. Материалом для статьи послужил видеоролик [1] с замечательного YouTube-канала LaurieWired. Все примеры кода тестировались на Raspberry Pi [2] в операционной системе Raspberry Pi OS (Linux), процессор ARM. [Выделение памяти на C+: new, delete] Создайте файл allocate.cpp со следующими содержимым: #include < iostream> #include < new> int main() { int *num_ptr = nullptr; try { // Выделение блока памяти размером числа int: num_ptr = new int; // Использование выделенного блока, запись в него числа 4660 (0x1234): *num_ptr = 0x1234; // Вывод этого числа на печать: std::cout << "Dynamic number: " << *num_ptr << std::endl; } catch (const std::bad_alloc& e) { return 1; } // Освобождение выделенной памяти. Память будет // возвращена операционной системе: delete num_ptr; return 0; } Скомпилируйте файл allocate.cpp командой: $ g++ allocate.cpp -o allocate После компиляции получится исполняемый файл allocate, запустите его: $ ./allocate Dynamic number: 4660 На языке C++ для выделения памяти также можно использовать стандартные библиотечные вызовы malloc, free, realloc, которые используются при программировании на языке C. [Выделение памяти на C: malloc, free] Создайте файл allocate.c со следующими содержимым: #include < stdio.h> #include < stdlib.h> int main () { // Выделение блока памяти размером числа int: int *num_ptr = (int*) malloc(sizeof(int)); // Проверка, была ли успешно выделена память: if (NULL == num_ptr) { // Выделить память не получилось. return 1; } // Использование выделенного блока, запись в него числа 4660 (0x1234): *num_ptr = 0x1234; // Вывод этого числа на печать: printf("Dynamic number: %d\n", *num_ptr); // Освобождение выделенной памяти: free(num_ptr); return 0; } Скомпилируйте allocate.c: $ gcc allocate.c -o allocate Запуск allocate: $ ./allocate Dynamic number: 4660 [Выделение памяти на языке ассемблера ARMv7: mmap, munmap] На языке ассемблера мы будем использовать системные вызовы mmap, munmap [3] стандартной библиотеки C. Вызов mmap() создает новое отображение анонимного файла или устройства в виртуальное адресное пространство текущего вызывающего процесса. Декларация функций mmap, munmap на языке C (определения из sys/mman.h): void *mmap(void addr[.length], size_t length, int prot, int flags, int fd, off_t offset); int munmap(void addr[.length], size_t length); Начальный адрес для нового отображения задается параметром addr. Аргумент length задает размер выделяемой области в байтах (который должен быть больше 0). Создайте файл allocate.s со следующим содержимым: .section .text extern printf global main Компиляция allocate.s: $ arm-linux-gnueabi-as allocate.s -o allocate.o $ arm-linux-gnueabi-gcc -static allocate.o -o allocate Запуск allocate: $ ./allocate Dynamic number: 4660 [Ссылки] 1. Mastering Memory: Allocation Techniques in C, C++, and ARM Assembly site:youtube.com. |