Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4

Как написать функцию выделения памяти?

18.08.2020, 01:51. Показов 7292. Ответов 76
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько сложно это сделать? Покажите примитивный механизм поиска памяти, как вариант мне даже интересно посмотреть как работают известные функции(new maloc caloc), я читал что по принципу сборщика мусора но механизмов реализации не видел.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.08.2020, 01:51
Ответы с готовыми решениями:

Как написать программу для динамического выделения памяти с использованием new
Надо написать прогу, которая выделяет память для структур размером в 2048 байт и обрабатывает ситуацию в случае ее нехватки. Я понятия не...

Передача массива указателей в функцию для выделения памяти
Есть функция, в которую передаются массивы указателей, для выделения памяти. void str_malloc(char** &strBol,char**...

Создать функцию для выделения памяти под двумерный массив
1. C++ Создать функцию для выделения памяти под двумерный массив.

76
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
18.08.2020, 01:59
Цитата Сообщение от Nexi99 Посмотреть сообщение
посмотреть как работают известные функции(new maloc caloc)
1. new это не функция
2. Вот примерная реализация malloc() и free()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
typedef struct _mem_dictionary
{
    void *addr;
    size_t size;
    int freed;
} mem_dictionary;
 
 
void *malloc(size_t size)
{
     void *return_ptr = NULL;
     int i;
 
     if (dictionary == NULL) {
         dictionary = sbrk(1024 * sizeof(mem_dictionary));
         memset(dictionary, 0, 1024 * sizeof(mem_dictionary));
     }
 
     for (i = 0; i < dictionary_ct; i++)
         if (dictionary[i].size >= size
          && dictionary[i].freed)
     {
         dictionary[i].freed = 0;
         return dictionary[i].addr;
     }
 
     return_ptr = sbrk(size);
 
     dictionary[dictionary_ct].addr = return_ptr;
     dictionary[dictionary_ct].size = size;
     dictionary[dictionary_ct].freed = 0;
     dictionary_ct++;
 
     return return_ptr;
}
 
void free(void *ptr)
{
    int i;
 
    if (!dictionary)
        return;
 
    for (i = 0; i < dictionary_ct; i++ )
    {
        if (dictionary[i].addr == ptr)
        {
            dictionary[i].freed = 1;
            return;
        }
    }
}
Добавлено через 53 секунды
Взято отсюда: malloc implementation
2
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
18.08.2020, 02:17  [ТС]
Цитата Сообщение от AndryS1 Посмотреть сообщение
sbrk(size)
Значит всё дело кроется в функции sbrk, которая заранее знает может ли операционная система дать память или нет, также упоминается что-то про сегменты?
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
18.08.2020, 02:35
Цитата Сообщение от Nexi99 Посмотреть сообщение
которая заранее знает может ли операционная система дать память или нет
заранее даже система не знает, но в большинстве случаев она может выделить

Добавлено через 4 минуты
И эта функция sbrk не обязана вообще существовать, она нигде не задокументирована и не является частью стандарта
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
18.08.2020, 02:41  [ТС]
Цитата Сообщение от AndryS1 Посмотреть сообщение
И эта функция sbrk не обязана вообще существовать, она нигде не задокументирована и не является частью стандарта
Память поделена на блоки, по ходу sbrk обращается к этому блоку и смотрит можно оттуда взять или нет. Возникает 2 вопроса.
1. Что стоит за sbrk? Как происходит проверка блока?
2. Я смотрю пишется что sbrk и malloc отдельные автономные функции. sbrk более древняя. Значит этот вариант проста переписка sbrk и возможно malloc работает по другому.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
18.08.2020, 02:50
Цитата Сообщение от Nexi99 Посмотреть сообщение
Что стоит за sbrk? Как происходит проверка блока?
Система, система и ещё раз система
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я смотрю пишется что sbrk и malloc отдельные автономные функции. sbrk более древняя.
Они обе существовали с появления Си, sbrk не задокументированная и используется ТОЛЬКО в хедерах Си
Цитата Сообщение от Nexi99 Посмотреть сообщение
Значит этот вариант проста переписка sbrkи возможно malloc работает по другому.
sbrk там вообще не переопределяли, но то что они работают по другому 100%, то лишь попытка переделать malloс, сама реализация malloc скрыта и закомпилена в какие-нибудь либы
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
18.08.2020, 21:44  [ТС]
Цитата Сообщение от AndryS1 Посмотреть сообщение
sbrk там вообще не переопределяли, но то что они работают по другому 100%, то лишь попытка переделать malloс, сама реализация malloc скрыта и закомпилена в какие-нибудь либы
Я вчера нашёл много информации по этим функциям malloс использует sbrk. sbrk выделяет память в байтах, это просто функция выделения, она не создаёт конструкторов деструкторов, не сохраняет значение запрошенное у системы. Ещё есть brk mmap и ещё какае-та функция. Походу все функции (new maloc caloc realoc -основная задача этих функций придать гибкость низкоуровневым функциям) выделения памяти построены на них.
Очень странно что документация скрыта по вашему мнению, а может мы просто не знает где прочесть эти инструкции они же должны быть, или бывают такие модули которые скрыты в целях авторского права или из-за нецелесообразности оглосовки того как работает функция.

Добавлено через 4 минуты
Цитата Сообщение от AndryS1 Посмотреть сообщение
sbrk
Нужно ли подключать библиотеки чтобы получить доступ к использовании этой функции?
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
18.08.2020, 21:47
https://www.opennet.ru/man.sht... &russian=0
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
18.08.2020, 23:41  [ТС]
Цитата Сообщение от Nishen Посмотреть сообщение
https://www.opennet.ru/man.sht... &russian=0
значит нужно подключить
#include <unistd.h> чтобы использовать sbrk. Хорошо а что скрыто за sbrk? Это последняя функция, которая обращается к блоку или сегменту данных чтобы сичтема выделила память или и за этой функцией что-то стоит?
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
18.08.2020, 23:45
Ищи sbrk implementation.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
19.08.2020, 10:36  [ТС]
Цитата Сообщение от Nishen Посмотреть сообщение
Ищи sbrk implementation.
Ничего нового не нашёл. Видимо sbrk конечная функция, которая стоит между тем же Maloc (и другими) и системой. Хотя мне кажется что за ней что-то стоит либо стоит понять как она просит память. Я читал что происход сдвиг указателя в куче, и тем самым память в куче уменьшается и перенаправляется под нужды. Возможно стоит посмотреть Ассемблер и написать функцию которая напрямую будет просить память, возникает вопрос целесообразно ли это.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
19.08.2020, 10:39
Цитата Сообщение от Nexi99 Посмотреть сообщение
ничего нового не нашёл
https://code.woboq.org/userspa... brk.c.html
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
19.08.2020, 11:01
Цитата Сообщение от Nexi99 Посмотреть сообщение
целесообразно ли это
Думаешь никто не смог придумать такого? Попробуй, если считаешь, что подобная практика важна для тебя.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
30.08.2020, 17:51
Цитата Сообщение от Nexi99 Посмотреть сообщение
sbrk выделяет память в байтах, это просто функция выделения, она не создаёт конструкторов деструкторов, не сохраняет значение запрошенное у системы. Ещё есть brk mmap и ещё какае-та функция. Походу все функции (new maloc caloc realoc -основная задача этих функций придать гибкость низкоуровневым функциям) выделения памяти построены на них.
Простейшая реализация malloc()/free() - без VirtualAlloc() и mmap().

При компоновке, загрузке программы или инициализации кучи создаётся 1 свободный блок, занимающий всё выделенное под кучу пространство.
C++
1
 extern _memory_block _heap;
malloc() находит сводный блок подходящего размера, вырезает в нём область требуемого размера, заполняет заголовок и возвращает адрес програме,
Размер свободного блока уменьшается на величину нового занятого блока.
Если подходящего свободного блока нет, malloc() возвращает 0.

free(), когда получает адрес предварительно выделенного блока, помечает его как свободный,
и, если это возможно, объединяет его с соседними свободными блоками в один сплошной блок.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
31.08.2020, 15:12  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
При компоновке, загрузке программы или инициализации кучи создаётся 1 свободный блок, занимающий всё выделенное под кучу пространство.
То что вы написали слишком абстрактно. Если вы пишите про блоки укажите где они находятся эти блоки и как
C++ (Qt)
1
malloc()
с ними соединяется, покажите механизм если конечно это не нарушает ваше авторское право на многолетний труд, как вариант пойдёт и самый примитивный вариант. А то тоже блоки блоки так давайте сами напишем функция и сами будем управлять этими блоками. Как раз таки первичная функция
C++ (Qt)
1
sbrk
и др. которые я выше упоминал и занимаются этим, она просит память у системы и отодвигает указатель дальше, получается что система теряет память а
C++ (Qt)
1
sbrk
возвращает указатель и если нужно может нумеровать этот участок как блок но этого можно и не делать т.к. указатель есть и этого достаточно.
Если вы считаете что схема работает на блоках покажите реализацию этих блоков. Потому что я тоже про блоки наслышан но информации нормальной не нашёл, я так понял что блоки это просто участки на которые поделен объёмы захваченной памяти низкоуровневыми функциями, при чём если
C++ (Qt)
1
sbrk
отодвигает память и это и есть блок то получается что участок где захватывается память один вот и всё и система управляет им сама она постоянно фрагментирует его чтобы он был в одном месте чтобы память запрашивалась от туда.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.08.2020, 19:50
Цитата Сообщение от Nexi99 Посмотреть сообщение
Потому что я тоже про блоки наслышан но информации нормальной не нашёл, я так понял что блоки это просто участки на которые поделен объёмы захваченной памяти низкоуровневыми функциями,
Верно. Блоки создаются в участках памяти, которые выделены под кучу или до запуска программы или, если заранее распределённой кучи не хватило, во время выполнения в страницах, размещенных в свободном адресном пространстве процесса библиотечными функциями или системными вызовами типа mmap().

Для чего майкрософтовскому компоновщику параметр /HEAP ?
https://docs.microsoft.com/en-... -heap-size
И кто выделяет память для подобных массивов?

C++
1
2
3
4
5
// -std=c++14
#include  <cstddef>
 
constexpr size_t  _heapsize { 010'0000'0000 };
int _heap[ _heapsize ];
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.08.2020, 20:00
Цитата Сообщение от Nexi99 Посмотреть сообщение
покажите механизм если конечно это не нарушает ваше авторское право
Ну, если работаете под виндой, то вопрос именно про микрософтовское авторское право, ибо это их операционная система. В данном случае обсуждаются именно исходники линукса, которые открыты.

Добавлено через 4 минуты
А так непосредственная реализация этих вызовов является составной частью операционной системы, а за генерацию прослойки между программным кодом и этими вызовами отвечает компилятор (языка С++ и/или С)
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.08.2020, 20:12
Операционной системы может и не быть.
А майкрософтовские реализации стандартной библиотеки могут посмотреть пользователи Microsoft Visual Studio.
Для остальных опубликовано немало иного майкрософтовского добра:
https://github.com/microsoft/S... oupper.cpp
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
31.08.2020, 21:32  [ТС]
Ну значит понятно что современные функции построены на sbrk и низкоуровневых функциях да и всё а эти блоки являются частью одного целого участка памяти.
Если я правильно понял то sbrk запрашивает память грубо говоря у ядра, потому что на Ассемблере тоже есть такая функция с похожим названием а библиотеки ОС оптимизируют это дело.
Можно на этих низкоуровневых функциях построить свои функции более экономно и которые будут работать лучше, но честно говоря целесообразность низкая, в принципе те функции которые представлены разработчиками работают довольно хорошо как мне кажется. Буду жить буду видеть если реализую контрольные задачи то такую функция выделения памяти стоит написать.

Добавлено через 4 минуты
Цитата Сообщение от politoto Посмотреть сообщение
Для чего майкрософтовскому компоновщику параметр /HEAP ?
Хороший вопрос тут же ещё есть виртуальная память а есть физическая в этом направлении стоит тоже покопать. Стоит понять где просит память sbrk и какой функцией опрашивать виртуальную память раз вы об этом упомянули.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.08.2020, 23:04
brk()/sbrk() устарели ещё в 1990-х
https://pubs.opengroup.org/onl... h/brk.html
а потом их и вовсе убрали из стандартов
https://pubs.opengroup.org/onl... tions.html

https://man7.org/linux/man-pages/man2/brk.2.html
Цитата Сообщение от brk(2)
Avoid using brk() and sbrk(): the malloc(3) memory allocation package
is the portable and comfortable way of allocating memory.
Но glibc поддерживает как один из вариантов morecore() в стиле sbrk() (возможно, самодельного)
https://sourceware.org/git/?p=... c/malloc.c
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2020, 23:04
Помогаю со студенческими работами здесь

Написать функцию выделения первого слова из строки
Написать эту функцию - это ещё пол беды. Ещё необходимо ИСПОЛЬЗУЯ именно эту функцию найти в строке первое слово (не число) максимальной...

Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память)
Дан класс и указатель: class X{ int a; public: X(int _a) {a = _a;} }; X *p; Напишите инструкцию выделения памяти для...

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки данными с клавиатуры, 3) выводящую...

Написать код для динамического выделения памяти под массив из 10000 целых чисел
Прошу помочь с решением ! Написать код для динамического выделения памяти под массив из 10000 целых чисел. Продемонстрировать заполнение...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru