|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
10.03.2010, 22:20 | #1 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Динамическое выделение памяти, как лучше?
в общем пишу я библиотеку(ДЛЛ хотя может и не только)
ей нужно хранить данные двух типов напишу по Дельфийски Код:
вообще загружатся они будут порциями(в большинстве случаев) от 10 до ....лимитом 65535 будет. изредка по одной варианта 3(у меня в голове): 1)обычный массив, но мне не нравится что при расширении оного придется копировать(если первый поидее расти будет только при загрузке, то второй вообще в любой момент...и предположительно на один-два элемента за раз) 2)списки, соответственно расширить легко...но при большом обьеме мне как то не улыбается оно. 3)смесь 1 и 2 а именно Код:
и еще как лучше память выделять?(VirtualAlloc,LocalAlloc,G lobalAlloc,HeapAlloc) Заранее спасибо(тему создал тут так как она не относится к ЯП) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
10.03.2010, 22:34 | #2 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Я обычно для таких целей использую VirtualAlloc, и кстати у нее первый параметр - адрес где выделить память. Можно будет указать на адрес последнего байта массива+1 и она по идее выделит как раз после вашего массива. Таким образом вы сможете расширять доступную память.
Выделять лучше блоками по 4кб и адресами кратными этим же 4кб.
"Тяжело в учении, легко в бою" - А.В. Суворов
|
10.03.2010, 22:38 | #3 | |
Заблокирован
Старожил
Регистрация: 20.07.2008
Сообщений: 4,032
|
Цитата:
|
|
10.03.2010, 22:46 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
потому что размер страницы памяти 4КБ
но меня смущает одно...а если я неверно выберу точку отсчета для массива то память то мне не дадут... так что наверно всетаки лучше третий вариант? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
10.03.2010, 23:14 | #5 | |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Цитата:
Все очень просто. Во всех процессах есть огромный пласт невыделенной памяти(вернее это просто виртуальная память, за которой не закреплена ни физическая ни своп-файл). Вот его можно выбрать в качестве плацдарма для создания огромного массива. Ну и в конце концов ведь можно сделать связанный список из записей. Посмотреть адрес неразмеченной памяти можно последовательным перебором VirtualQuery В MEMORY_BASIC_INFORMATION есть поле RegionSize. В цикле проверяем его и если оно больше чем максимально-требуемый вам объем памяти - выбираете AllocationBase как начальный адрес для VirtualAlloc. Вот например скриншот регионов памяти сделанный из CheatEngine: По идее еще можно использовать HeapCreate - при нем тоже только резервируется нужный объем памяти. Правда там говорится о фрагментированнии данных, что не подходит. Или может быть я просто неправильно понял что там написано. HeapFunctions А первый параметр кстати можно указать нулем и тогда функция сама выберет ближайший пригодный блок. UPDATE: Кажется я немного идиот... VirtualAlloc с параметром MEM_RESERVE как раз резервирует нужный объем памяти
"Тяжело в учении, легко в бою" - А.В. Суворов
Последний раз редактировалось Ivan_32; 10.03.2010 в 23:25. |
|
11.03.2010, 00:06 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
ну значит оставим третий вариант...но перед тем как создать новый узел списка, буду пытатся расширить старый
тему можно закрыть Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
11.03.2010, 06:55 | #7 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Я конечно не спец, но как насчет динамического массива твоих структур?
Код:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
11.03.2010, 07:04 | #8 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
но возможно по кучке подрят(оптимизировать этот момент значит излишне усложнить разработку модулей к библиотеке, итак не очень удобное дело выходит) тогда вообще выйдет постоянное копирование...меня это не устраивает я выбрал размер записи одной(одного блока записей если точнее) в 0x2000 и оставил на совесть винды выбор места для размещения. там выходит небольшой излишек(заголовок блока 8 байт, записи размерами 8,12,16) но лучше уж так чем очень долгая загрузка записи. при 2 варианте вообще потери не малые получаются(на указатель на след запись) ЗЫ, пишу не на Делфи, а на ассемблере Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 11.03.2010 в 09:20. |
|
11.03.2010, 08:40 | #9 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Я такие вещи упаковываю в класс. И делаю еще один класс, с полем типа TObjectList или коллекцией.
И пуст классы сами память распределяют, че это я еще моск об эти скалы ломать буду.
I'm learning to live...
|
11.03.2010, 09:09 | #10 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Виталий, какие классы в Ассемблере?)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 11.03.2010 в 09:13. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
динамическое выделение памяти под верхний треугольник квадратной матрицы | juventine | Помощь студентам | 2 | 12.04.2009 13:02 |
Динамическое выделение памяти под массивы | Артем125 | Общие вопросы C/C++ | 4 | 07.04.2009 09:52 |
Динамическое выделение памяти | FW-TOT | Общие вопросы C/C++ | 2 | 19.12.2008 00:42 |