Как написать функцию выделения памяти?18.08.2020, 01:51. Показов 7300. Ответов 76
Метки нет (Все метки)
Насколько сложно это сделать? Покажите примитивный механизм поиска памяти, как вариант мне даже интересно посмотреть как работают известные функции(
new maloc caloc), я читал что по принципу сборщика мусора но механизмов реализации не видел.
0
|
|
| 18.08.2020, 01:51 | |
|
Ответы с готовыми решениями:
76
Создать функцию для выделения памяти под двумерный массив |
| 31.08.2020, 23:18 [ТС] | ||
brk является первичной функцией низкоуровневой тот её и не нужно указывать в стандартах: 1)потому что она только просит память и возвращает указатель; 2)она не сохраняет размер( и номер блока если это нужно); 3)она не инициализирует запрошенный участок; 4)она не помечает поля с которыми вы работаете; 6)возможно не работает с виртуальной памятью т.е. вообще либо не производит никаких регулировок (точно не знаю потому что спрашиваю сам); 5)она не производит никаких оптимизаций в отличие от maloc и newДругими словами это сырая функция. Что по вашему стоит за maloc в последней вашей ссылке тоже используется brk. Вы знаете какие-нибудь методы запроса памяти не используя maloc brkВы выше упомянули виртуальную память про неё то я забыл. Я так понимаю что brk запрашивает физическую память в отличие от maloc который является функцией разработчиков и работает правильно, в неё конечно вложен многолетний труд. Я думаю что new использует maloc, последняя более первичная функция по отношении к new?
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 01.09.2020, 01:12 | |||||||
0
|
|||||||
|
Модератор
|
|
| 01.09.2020, 06:25 | |
|
Кен Томпсон написал break в UNIX раньше.
Когда написали первый Си, break уже был. И использовался в ранних юниксовых программах. http://man.cat-v.org/unix-1st/2/sys-break
0
|
|
|
Модератор
|
||
| 01.09.2020, 15:57 | ||
myMalloc(), который написал Renji, https://www.cyberforum.ru/post14812869.htmlкак раз работает по принципу sbrk()
0
|
||
| 01.09.2020, 22:28 [ТС] | ||
Малокиэто модифицированные функции а sbrk()это просто сырая функция выделяющая память. Ну там идёт не выделение, там происходит имитация это функция просто двигает указатель внутри ядра или где там короче подаёт команду в процессор(грубо говоря тонкостей нельзя всех знать). Меня заинтересовало то что вы выше написали что есть ещё и виртуальная память и возникает вопрос где просит память sbrk(), это будет физическая память которую нужно самому регистрировать в виртуальную страницу или эта деталь уже учтена т.е. работа изначально происходит с виртуальной памятью. Но опять же есть ещё библиотека "windows.h", которая работает с исключениями а также там проверяется выход за пределы виртуальной страницы, получается что работая с sbrk() нужно самому это дело настраивать или нет?
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 02.09.2020, 00:30 | ||
|
2
|
||
|
Модератор
|
|||||||||||
| 02.09.2020, 05:34 | |||||||||||
|
Минимальная реализация
realloc() в стиле Microsoft Windows. ![]() https://github.com/changloong/... b/malloc.c Организация управления памятью прилкадных программ к с++ напрямую не относится. Это или общие вопросы практики программирования или https://www.cyberforum.ru/c-linux/ и https://www.cyberforum.ru/c-linux/ , если обсуждаются особенности конкретных систем. Кликните здесь для просмотра всего текста
А в с++ new, delete, std::realloc() - средства перераспределения памяти с целью последующего создания в ней новых объектов.И изучаеющему полезно помнить, что стандарт с++ позволяет переопределять operator new (и delete) как глобально, так и для отдельных классов, а также определять новые варианты этих операторов ( с другими параметрами ), отсутствующие в стандарте.
0
|
|||||||||||
| 03.09.2020, 00:53 [ТС] | ||
sbrk()? Я имею в виду какую память просит sbrk() физическую или виртуальную или это не имеет значения, память по умолчанию запрашивается виртуальная а уже поиск физической памяти это уже не задача sbrk(), этим может заниматься ОС, если подана команда в ОС на запрос памяти то она её даёт, если виртуальной памяти не хватает то ОС просит физическую память и тем самым увеличиваем объём виртуальной а виртуальная память отдаёт часть себя нужной программе? Какие там примерно механизмы такие или нет?
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 03.09.2020, 01:36 | ||
|
Виртуальная "память" это просто ассоциативный массив внутри процессора, состоящий из пар "виртуальный адрес:куда обращаться за данными". Причем, "куда" может быть как физической памятью, так и вызовом некоторой функции (подгрузки свопа, например). Все эти sbrk просто оформляют бумажку "предъявителю сего выдать данные по обращению к адресу 0x12345678". Выдадут ли по этой бумажке хоть что-то или менеджер памяти внезапно объявит себя банкротом - вопрос другой.
0
|
||
| 03.09.2020, 02:44 [ТС] | ||
sbrk() не целесообразно да и по большей степени мы в своих функциях такую проверку не делаем т.к. 99% что new maloc дадут память. В общем на этой функции можно свободно строить свои функции.
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 03.09.2020, 03:46 | |||||||
0
|
|||||||
|
Модератор
|
||||||||||||||||||||||||||
| 03.09.2020, 11:34 | ||||||||||||||||||||||||||
brk() при этом на моей системе практически не дёргается
Microsoft linux на Windows 10 справляется с лабораторной работой по суммированию 27-гигабайтного массива.
0
|
||||||||||||||||||||||||||
|
Модератор
|
||||||
| 06.09.2020, 06:44 | ||||||
|
На 1000 new char[010000000000] всего 3 вызова
brk() за всё время работы программы, при том два из них - brk(0) .
0
|
||||||
|
Модератор
|
||||||
| 07.09.2020, 06:10 | ||||||
|
За этим системным вызовом стоит история UNIX и лично Кен Томпсон с покойным Деннисом Ритчи.
https://minnie.tuhs.org/Archiv... /man21.pdf https://minnie.tuhs.org/Archiv... _Jun72.pdf
0
|
||||||
|
Модератор
|
||||||||||||||||||||||||||
| 07.09.2020, 17:31 | ||||||||||||||||||||||||||
|
Не по теме:
Кликните здесь для просмотра всего текста
jsr r0,iget / get i-node for file to be executed
bit $20,i.flgs / is file executable beq error9 jsr r0,iopen / gets i-node for file with i-number given in / r1 (opens file) bit $40,i.flgs / test user id on execution bit beq 1f tstb u.uid / test user id beq 1f / super user movb i.uid,u.uid / put user id of owner of file as process / user id 1: mov (sp)+,r5 / r5 now contains address of list of pointers to / arguments to be passed mov $1,u.quit / u.quit determines handling of quits; / u.quit = 1 take quit mov $1,u.intr / u.intr determines handling of interrupts; / u.intr = 1 take interrupt mov $rtssym,30 / emt trap vector set to take system routine mov $fpsym,*10 / reserved instruction trap vector set to take / system routine mov $sstack,sp / stack space used during swapping mov r5,-(sp) / save arguments pointer on stack mov $ecore,r5 / r5 has end of core mov $core,r4 / r4 has start of users core mov r4,u.base / u.base has start of users core mov (sp),r2 / move arguments list pointer into r2 1: tst (r2)+ / argument char = "nul" bne 1b tst -(r2) / decrement r2 by 2; r2 has addr of end of arguent / pointer list 1: / move arguments to bottom of users core mov -(r2),r3 / (r3) last non zero argument ptr cmp r2,(sp) / is r2 = beginning of argument ptr list blo 1f / branch to 1f when all arguments are moved 2: tstb (r3)+ bne 2b / scan argument for \0 (nul) 2: movb -(r3),-(r5) / move argument char by char starting at / "ecore" cmp r3,(r2) / moved all characters in this argument bhi 2b / branch 2b if not mov r5,(r4)+ / move r5 into top of users core; r5 has / pointer to nth arg br 1b / string 1: clrb -(r5) bic $1,r5 / make r5 even, r5 points to last word of argument / strings mov $core,r2 1: / move argument pointers into core following argument strings cmp r2,r4 bhis 1f / branch to 1f when all pointers are moved mov (r2)+,-(r5) br 1b 1: sub $core,r4 / gives number of arguments *2 asr r4 / divide r4 by 2 to calculate the number of args stored mov r4,-(r5) / save number of arguments ahead of the argument / pointers clr -(r5) / popped into ps when rti in sysrele is executed mov $core,-(r5) / popped into pc when rti in sysrele / is executed mov r5,0f / load second copyz argument tst -(r5) / decrement r5 mov r5,u.r0 / sub $16.,r5 / skip 8 words mov r5,u.sp / assign user stack pointer value, effectively / zeroes all regs when sysrele is executed jsr r0,copyz; core; 0:0 / zero user's core clr u.break mov r5,sp / point sp to user's stack mov $14,u.count mov $u.off,u.fofp clr u.off / set offset in file to be read to zero jsr r0,readi / read in first six words of user's file, starting / at $core mov sp,r5 / put users stack address in r5 sub $core+40.,r5 / subtract $core +40, from r5 (leaves / number of words less 26 available for / program in user core mov r5,u.count / cmp core,$405 / br .+14 is first instruction if file is / standard a.out format bne 1f / branch, if not standard format mov core+2,r5 / put 2nd word of users program in r5; number of / bytes in program text sub $14,r5 / subtract 12 cmp r5,u.count / bgt 1f / branch if r5 greater than u.count mov r5,u.count jsr r0,readi / read in rest of user's program text add core+10,u.nread / add size of user data area to u.nread br 2f
https://www.tuhs.org/cgi-bin/u... n2/break.2 https://www.tuhs.org/cgi-bin/u... an2/exec.2 Те же exec() и sbreak(), переписанные на архаичном Си:https://www.tuhs.org/cgi-bin/u... ken/sys1.c Добавлено через 4 часа 9 минут А вот и простой malloc() на K&R https://www.tuhs.org/cgi-bin/u... r/malloc.c
1
|
||||||||||||||||||||||||||
|
Модератор
|
|||||||
| 07.09.2020, 21:17 | |||||||
![]() Вот, кстати, чуть короче реализация: https://www.tuhs.org/cgi-bin/u... sys/sys1.c
0
|
|||||||
|
Неэпический
|
|
| 07.09.2020, 21:49 | |
|
politoto, почему-то всегда читаю твой ник как "поллитро"
2
|
|
| 07.09.2020, 21:49 | |
|
Помогаю со студенческими работами здесь
40
Написать функцию выделения первого слова из строки Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память)
Написать код для динамического выделения памяти под массив из 10000 целых чисел Написать функцию выделения произвольной строки двумерного массива в одномерный Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|