Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2010, 22:20   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию Динамическое выделение памяти, как лучше?

в общем пишу я библиотеку(ДЛЛ хотя может и не только)
ей нужно хранить данные двух типов
напишу по Дельфийски
Код:
type
 1=record 
  Name:Pchar;
  F:pointer;//Function(PChar):LongInt;
 end;
 
 2=record
  Name:PChar;
  Type:LongInt;
  Value:Integer;
 end;
 
 3=LongInt;
я вот думаю как лучше всего хранить их?(их может быть не мало)

вообще загружатся они будут порциями(в большинстве случаев) от 10 до ....лимитом 65535 будет. изредка по одной

варианта 3(у меня в голове):
1)обычный массив, но мне не нравится что при расширении оного придется копировать(если первый поидее расти будет только при загрузке, то второй вообще в любой момент...и предположительно на один-два элемента за раз)
2)списки, соответственно расширить легко...но при большом обьеме мне как то не улыбается оно.
3)смесь 1 и 2
а именно
Код:
type
 Arr=record
  Count:word;
  Free:word;
  Data:array[0..0] of 1;//или второго типа или третьего
end
как лучше все таки?я склоняюсь к третьему варианту...но мало ли я не прав?


и еще как лучше память выделять?(VirtualAlloc,LocalAlloc,G lobalAlloc,HeapAlloc)

Заранее спасибо(тему создал тут так как она не относится к ЯП)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2010, 22:34   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Я обычно для таких целей использую VirtualAlloc, и кстати у нее первый параметр - адрес где выделить память. Можно будет указать на адрес последнего байта массива+1 и она по идее выделит как раз после вашего массива. Таким образом вы сможете расширять доступную память.
Выделять лучше блоками по 4кб и адресами кратными этим же 4кб.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 10.03.2010, 22:38   #3
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Цитата:
Выделять лучше блоками по 4кб и адресами кратными этим же 4кб.
Это для кэша?
Levsha100 вне форума Ответить с цитированием
Старый 10.03.2010, 22:46   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что размер страницы памяти 4КБ
но меня смущает одно...а если я неверно выберу точку отсчета для массива то память то мне не дадут...
так что наверно всетаки лучше третий вариант?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2010, 23:14   #5
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Цитата:
Это для кэша?
Что то вроде того. Плюс сократится количество записей в TLB-кеше. Если выделить блок из 4096 байт средина которого скажем придется на начало новой страницы то в TLB попадет 2 записи о страницах, а не одна. Думаю при большом объеме разбросанных блоков от этого будет выигрыш.
Все очень просто. Во всех процессах есть огромный пласт невыделенной памяти(вернее это просто виртуальная память, за которой не закреплена ни физическая ни своп-файл). Вот его можно выбрать в качестве плацдарма для создания огромного массива. Ну и в конце концов ведь можно сделать связанный список из записей.

Посмотреть адрес неразмеченной памяти можно последовательным перебором VirtualQuery
В MEMORY_BASIC_INFORMATION есть поле RegionSize. В цикле проверяем его и если оно больше чем максимально-требуемый вам объем памяти - выбираете AllocationBase как начальный адрес для VirtualAlloc.
Вот например скриншот регионов памяти сделанный из CheatEngine:



По идее еще можно использовать HeapCreate - при нем тоже только резервируется нужный объем памяти. Правда там говорится о фрагментированнии данных, что не подходит. Или может быть я просто неправильно понял что там написано.

HeapFunctions

А первый параметр кстати можно указать нулем и тогда функция сама выберет ближайший пригодный блок.


UPDATE: Кажется я немного идиот... VirtualAlloc с параметром MEM_RESERVE как раз резервирует нужный объем памяти
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось Ivan_32; 10.03.2010 в 23:25.
Ivan_32 вне форума Ответить с цитированием
Старый 11.03.2010, 00:06   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну значит оставим третий вариант...но перед тем как создать новый узел списка, буду пытатся расширить старый

тему можно закрыть
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2010, 06:55   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я конечно не спец, но как насчет динамического массива твоих структур?

Код:
type
     TZap=record 
        Name:Pchar;
        F: pointer;//Function(PChar):LongInt;
     end;

type
    TZaps=record
        Zap: Array of TZap;
        Count: Integer;
   end;
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.03.2010, 07:04   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
1)обычный массив, но мне не нравится что при расширении оного придется копировать(если первый поидее расти будет только при загрузке, то второй вообще в любой момент...и предположительно на один-два элемента за раз)
вот что с ним не так...а данные будут добавлятся по одному(там вообще четыре массива выходит)
но возможно по кучке подрят(оптимизировать этот момент значит излишне усложнить разработку модулей к библиотеке, итак не очень удобное дело выходит) тогда вообще выйдет постоянное копирование...меня это не устраивает
я выбрал размер записи одной(одного блока записей если точнее) в 0x2000 и оставил на совесть винды выбор места для размещения.
там выходит небольшой излишек(заголовок блока 8 байт, записи размерами 8,12,16) но лучше уж так чем очень долгая загрузка записи.
при 2 варианте вообще потери не малые получаются(на указатель на след запись)

ЗЫ, пишу не на Делфи, а на ассемблере
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.03.2010 в 09:20.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2010, 08:40   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я такие вещи упаковываю в класс. И делаю еще один класс, с полем типа TObjectList или коллекцией.
И пуст классы сами память распределяют, че это я еще моск об эти скалы ломать буду.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.03.2010, 09:09   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Виталий, какие классы в Ассемблере?)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.03.2010 в 09:13.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическое выделение памяти под верхний треугольник квадратной матрицы 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