LINUX.ORG.RU

Не нужно. Смысла особого в нем нету. Тормоза на выделение/удаление памяти больше времени займет. Да и для чего это нужно, если не секрет?

Zodd ★★★★★
()
Ответ на: комментарий от Zodd

Тормоза на выделение/удаление памяти больше времени займет

Масдайный gc работает довольно таки шустро.

Да и для чего это нужно, если не секрет?

Прикладной цели нет, чисто интерес.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

и еще

Тормоза на выделение/удаление памяти больше времени займет

Я полагаю, здесь просто нужна бистрая реализация memcpy.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

Масдайный gc работает довольно таки шустро.

На фоне тормозящих прог, ну да (:

Логика вроде не сложная копирование памяти в новую непрерывную область, не?

Zodd ★★★★★
()

g_slice_alloc частично решит проблему фрагментации. И как дефрагментировать? Придется ведь тогда менять значения указателей.

Nakgidveef
()
Ответ на: комментарий от Zodd

Логика вроде не сложная копирование памяти

Афаик, memcpy реализован как побайтное копирование.

bk_ ★★
() автор топика
Ответ на: комментарий от Nakgidveef

Интересно, не знал. Но после прочтения возник вопрос: g_slice_alloc - это же только для выделения памяти, не для перераспределения?

И как дефрагментировать?

Например, после выполнения

realloc_all_like_dotnet_gc()
возвратится таблица соответствий: старый адрес - новый адрес.

Это первая реализация, что пришла в голову.

bk_ ★★
() автор топика

На сях такое не сделать. Для сей не удастся реализовать копирующий сборщик мусора.

dmitry_vk ★★★
()
Ответ на: комментарий от bk_

>> Масдайный gc работает довольно таки шустро.

О да, я около года поработал над сервером fragoria.ru. GC работает шустро только когда проц мощный, делать ему нечего и структура данных очень простая.

sergej ★★★★★
()
Ответ на: комментарий от bk_

> возвратится таблица соответствий: старый адрес - новый адрес.

такая таблица не поможет «исправить» указатели, которые указывают не на начало выделенной области

ahonimous
()

Java же!

Кто-то должен был это сказать

madgnu ★★★★★
()
Ответ на: комментарий от bk_

>g_slice_alloc - это же только для выделения памяти, не для перераспределения?

Его использование уменьшит фрагментацию, но он не годится для строк и массивов, только для структур.

Nakgidveef
()

А чем результаты поиска в гугле не устроили?

kulti ★★
()

Для C компактифицирующий GC нереально сделать.

anonymous
()

В .net gc переодически перераспределяет память, выделенную под конкретную программу, тем самым уменьшая фрагментрованность памяти. Как можно сделать такую же операцию на С в linux?

Предлагаю сначала хоть немного разобраться в основах .NET, C и управления памятью.

Deleted
()
Ответ на: комментарий от Nakgidveef

> И как дефрагментировать? Придется ведь тогда менять значения указателей.

Придется юзать не указатели, а более хитрую сущность, которая будет сама по себе жрать больше места и работать медленнее, зато позволит GC перекладывать объекты. Но это уже будет не C.

const86 ★★★★★
()

Для си ты не сделаешь дефрагментацию. Чтобы сделать надо превратить си в другой язык с кучей инфы о типах и переменных в рантайме.

Для си++ можно сделать defragmentable_ptr<T> но проще пулы использовать.

И да, переменные на стеке рулят.

legolegs ★★★★★
()
Ответ на: комментарий от Nakgidveef

>Придется ведь тогда менять значения указателей.
если дефрагментацией будет заниматься ядро - не придется.

xydo ★★
()
Ответ на: комментарий от xydo

если дефрагментацией будет заниматься ядро - не придется.

Чё?

mv ★★★★★
()

Зачем это нужно? Очередная ловля блох?

Zodd ★★★★★
()
Ответ на: комментарий от anonymous

Он же внутриядерный. Как он будет дефрагментировать то что выделено malloc'ом в юзерспейсе.

anonymous
()
Ответ на: комментарий от anonymous

>Он же внутриядерный. Как он будет дефрагментировать то что выделено malloc'ом в юзерспейсе.

Продефрагментируй лучше мозги. без обид.

anonymous
()
Ответ на: комментарий от anonymous

>> Продефрагментируй лучше мозги. без обид.

Какие умные анонимусы появились на лоре.

Я сделал млн malloc-ов по 1024 байта (1Г). Потом из каждых 4х блоков 1й оставил, а 2й,3й,4й - освободил. Итого: я использую 256М, а занят 1Г.

Как мне может помочь slab allocator?

sergej ★★★★★
()
Ответ на: комментарий от sergej

Предвосхищая остроумный ответ анонимуса, скажу: я знаю, что в данном случае помочь могут только мозги, использованные при проектировании программы.

sergej ★★★★★
()
Ответ на: комментарий от no-dashi

А это ничего, что в .NET указатели в принципе очень даже есть? И Си можно полноценно компилировать в .NET, между прочим.

anonymous
()
Ответ на: комментарий от legolegs

>И да, переменные на стеке рулят.

Реквестирую std::string полностью на стеке!

linuxfan
()
Ответ на: комментарий от anonymous

И Си можно полноценно компилировать в .NET, между прочим.

Да, но GC в таком случае просто не будет работать.

Deleted
()
Ответ на: комментарий от sergej

Я сделал млн malloc-ов по 1024 байта (1Г).
Потом из каждых 4х блоков 1й оставил, а 2й,3й,4й - освободил.
Итого: я использую 256М, а занят 1Г.

Скорее всего, в случае современного х86 , 1Г занят не будет. Надо читать про аритектуру проца/OS на пердмет protected mode. Например начать отсюда http://en.wikipedia.org/wiki/Protected_mode. Краткая мораль: цифра которую вы видите по printf(«%X»,pointer); не имеет прямого отношения к физическому положению в памяти.

Прочь руки испачканные GC от системного программирования :).

imatveev13
()
Ответ на: комментарий от imatveev13

>> Скорее всего, в случае современного х86 , 1Г занят не будет.

Будет. я даже проверил.

sbrk при малоках отодвигает границу, а т.к. страница = 4к, то ни одна из страниц не освобождается.

sergej ★★★★★
()
Ответ на: комментарий от anonymous

Да, но GC в таком случае просто не будет работать.

Будет. Не говорите глупостями.

Не будет. Как ты вообще себе представляешь автоматическое управление памятью, выделенной в С?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.