Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Август 31, 2009, 19:12



Название: Большие блоки памяти
Отправлено: Igors от Август 31, 2009, 19:12
Добрый день

У меня правая рука Mac и левая (довольно хилая :)) Вындоуз. Так что я буду говорить только о том что я лично проверял на Mac. Пришлось переделывать несколько старых плагинов, которые использовали такую технику:

- получить размер максимального свободного блока памяти
- распределить этот блок
- внутри него использовать свою кучу (heap)
- по окончанию перераспределить память с помощью realloc (например выделили 500Mb а оказалось что нужно 2Mb)

Такой подход с треском проваливается ввиду:

- не существует больше понятия "максимального свободный блок памяти" - вся память виртуальна и непрерывна

- OS правильно говорит сколько памяти свободно, но попытки выделить блок больше 1Gb возвращают NULL. (в 32-bits и в 64-bits без разницы). Хотя я могу выделить, напрмер, 4 блока по 500Mb. Нашел способ обойти это (vm_allocate) но это глухой нативняк и работать с ним неудобно.

- realloc НЕ работает вообще, блок памяти он обрезает но все равно он недоступен для следующих распределений. После "гугления" узнал что это, мол, стандарт для Darwin систем. Кто там из них Дарвин - для меня без разницы, OSX я держать должен.

Вопрос(ы): пацаны, что слышно на других платформах?


Название: Re: Большие блоки памяти
Отправлено: Winstrol от Август 31, 2009, 19:40
- по окончанию перераспределить память с помощью realloc (например выделили 500Mb а оказалось что нужно 2Mb)
А как достигалается ссылочная целостность? realloc может вернуть указатель на новый блок. Соответственно, все указатели на старый станут невалидыми.


Название: Re: Большие блоки памяти
Отправлено: Igors от Август 31, 2009, 19:52
А как достигалается ссылочная целостность? realloc может вернуть указатель на новый блок. Соответственно, все указатели на старый станут невалидыми.
Я это бы пережил и "целостность" бы подправил  :) Дело в том что realloc память не освобождает - как было занято, например, 500Mb  - так и осталось после realloc. Цепочка таких плагинов очень быстро кончается "application ran out of memory"


Название: Re: Большие блоки памяти
Отправлено: Winstrol от Сентябрь 01, 2009, 12:52
А как достигалается ссылочная целостность? realloc может вернуть указатель на новый блок. Соответственно, все указатели на старый станут невалидыми.
Я это бы пережил и "целостность" бы подправил  :) Дело в том что realloc память не освобождает - как было занято, например, 500Mb  - так и осталось после realloc. Цепочка таких плагинов очень быстро кончается "application ran out of memory"
Как определить максимальный объем, выделение которого не приведет к out of memory не скажу. Единственное, что сразу приходит в голову - выделить 20 мб, если не хватило, сделать realloc до 40 и.т.д. Но, боюсь, велосипед сей будет работать много тормозней стандартного распределителя.


Название: Re: Большие блоки памяти
Отправлено: Igors от Сентябрь 01, 2009, 14:48
Как определить максимальный объем, выделение которого не приведет к out of memory не скажу.
"Поздно пить Боржоми" - максимального объема уже тоже нет  :)
Единственное, что сразу приходит в голову - выделить 20 мб, если не хватило, сделать realloc до 40 и.т.д. Но, боюсь, велосипед сей будет работать много тормозней стандартного распределителя.
Да, пришлось переделывать все на new/malloc и все большие массивы выделять chunk'ами  :P