2010-12-06 3 views
8

Недавно я сделал нового друга. Его зовут _expand, и у нас были приятные разговоры, и я даже несколько раз встречался с ним. Но когда я начал спрашивать, никто не слышал о моем «экспандере». Я стал подозрительным. Я позвонил нескольким совершенно не метафорическим друзьям в microsoft и нескольким друзьям в другом месте бизнеса. Ничего. Никто никогда не использовал его. Я лакомился вокруг различных поисковых систем и источников деревьев. Ничего, кроме беглого упоминания здесь и там. Конечно, недостаточно информации о производительности и совместимости для меня, чтобы ввести _expand в производственный код или более уместно, общие библиотеки._Expand против нового по сравнению с GNU

Хуже того, нет никакой эквивалентной функции, которую я могу найти в любой из библиотек gnu, поэтому все, что я взламываю с моим новым другом, ни в коем случае не будет переносимым. Какой позор, потому что это действительно увлекательная и захватывающая способность иметь. Конечно, я мог бы перекопать в realloc и разобраться, как он функционирует, но проблема в том, что большая часть реализации сильно изменена на * nixes. Поэтому мне пришлось бы использовать версию кода после версии, чтобы попытаться получить портативный _expand. Тем не менее, кажется смешным, что ничего подобного не существует в glib или расширенных gnu libs.

  1. Есть ли аналогичная функция, которую я должен знать о взломе linux? Больше всего ответила
  2. Есть ли стандартный крючок, на котором я мог бы построить подобную функцию? Ответа на этот вопрос
  3. Кто-нибудь знает, какую работу предлагает _expand?
  4. Как он взаимодействует с объектами, выделенными на LFH?

Чтобы прояснить мои интересы, я пытаюсь создать односвязный аккумулятор, который расширяется, пытаясь минимизировать фрагментацию при распределении блоков с несколькими элементами в соответствии с традиционными реализациями deque. Ограничивая варианты использования для добавления и удаления элементов, я надеюсь оптимизировать время для удаления для всей структуры, а также вставить и индексировать элементы. В результате «громкий сбой» _expand позволяет мне заставить структуру разумно подумать о том, когда и если она может изменить размер на месте, и что это значит о том, где она может помещать данные.

+8

Nice литературных стилей. Теперь убей их. На все наши вопросы. Быстро. – dmckee 2010-12-06 02:11:07

+0

Вероятно, есть причина, по которой никто никогда ее не использует. – 2010-12-06 02:15:11

ответ

3

Этот C++ работает с new и delete. Без эквивалента realloc показано, как мало внимания уделяется этим вещам. Невосприимчивость _expand в значительной степени игнорируется, когда она даже не доступна на уровне ОС. Если вы хотите просмотреть свои собственные, существует множество прецедентов для пользовательских версий malloc, а быстрый просмотр в /usr/include/malloc.h на моем ящике Linux показывает явно явные для этого ...

/* Called once when malloc is initialized; redefining this variable in 
    the application provides the preferred way to set up the hook 
    pointers. */ 
extern void (*__malloc_initialize_hook) __MALLOC_PMT ((void)); 
/* Hooks for debugging and user-defined versions. */ 
extern void (*__free_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr, 
             __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__malloc_hook) __MALLOC_PMT ((size_t __size, 
                __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__realloc_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr, 
                size_t __size, 
                __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__memalign_hook) __MALLOC_PMT ((size_t __alignment, 
                 size_t __size, 
                 __const __malloc_ptr_t)); 
extern void (*__after_morecore_hook) __MALLOC_PMT ((void)); 

Не похоже, что вы сможете перехватить существующую реализацию realloc в этой конкретной точке принятия решения, или легко получить представление о том, будет ли она изменяться в пространстве, поэтому вам, возможно, придется переопределить все (или адаптировать любую из многих существующих кучи).