![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
в общем пишу я библиотеку(ДЛЛ хотя может и не только)
ей нужно хранить данные двух типов напишу по Дельфийски Код:
вообще загружатся они будут порциями(в большинстве случаев) от 10 до ....лимитом 65535 будет. изредка по одной варианта 3(у меня в голове): 1)обычный массив, но мне не нравится что при расширении оного придется копировать(если первый поидее расти будет только при загрузке, то второй вообще в любой момент...и предположительно на один-два элемента за раз) 2)списки, соответственно расширить легко...но при большом обьеме мне как то не улыбается оно. 3)смесь 1 и 2 а именно Код:
и еще как лучше память выделять?(VirtualAlloc,LocalAlloc,G lobalAlloc,HeapAlloc) Заранее спасибо(тему создал тут так как она не относится к ЯП) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#2 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
![]()
Я обычно для таких целей использую VirtualAlloc, и кстати у нее первый параметр - адрес где выделить память. Можно будет указать на адрес последнего байта массива+1 и она по идее выделит как раз после вашего массива. Таким образом вы сможете расширять доступную память.
Выделять лучше блоками по 4кб и адресами кратными этим же 4кб.
"Тяжело в учении, легко в бою" - А.В. Суворов
|
![]() |
![]() |
![]() |
#3 | |
Заблокирован
Старожил
Регистрация: 20.07.2008
Сообщений: 4,032
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
потому что размер страницы памяти 4КБ
но меня смущает одно...а если я неверно выберу точку отсчета для массива то память то мне не дадут... так что наверно всетаки лучше третий вариант? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#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. |
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
ну значит оставим третий вариант...но перед тем как создать новый узел списка, буду пытатся расширить старый
![]() тему можно закрыть Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Я конечно не спец, но как насчет динамического массива твоих структур?
Код:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
но возможно по кучке подрят(оптимизировать этот момент значит излишне усложнить разработку модулей к библиотеке, итак не очень удобное дело выходит) тогда вообще выйдет постоянное копирование...меня это не устраивает я выбрал размер записи одной(одного блока записей если точнее) в 0x2000 и оставил на совесть винды выбор места для размещения. там выходит небольшой излишек(заголовок блока 8 байт, записи размерами 8,12,16) но лучше уж так чем очень долгая загрузка записи. при 2 варианте вообще потери не малые получаются(на указатель на след запись) ЗЫ, пишу не на Делфи, а на ассемблере ![]() Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 11.03.2010 в 09:20. |
|
![]() |
![]() |
![]() |
#9 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Я такие вещи упаковываю в класс. И делаю еще один класс, с полем типа TObjectList или коллекцией.
И пуст классы сами память распределяют, че это я еще моск об эти скалы ломать буду.
I'm learning to live...
|
![]() |
![]() |
![]() |
#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 |