#include <fix_alloc.hpp>
Открытые типы | |
enum | { SIZE = (sizeof(T)+sizeof(void*)-1)/sizeof(void*)*sizeof(void*) } |
Размер выделяемой под T памяти. Подробнее... | |
Открытые статические члены | |
T * | alloc () |
Выделяет память (размера SIZE) для объекта T. | |
void | free (void *ptr) |
Освобождает ранее выделенную память. |
Он выделяет память кусками (около) CHUNK_SIZE и нарезает их на части размера SIZE. Полученная аллокатором у системы память ей не возвращается, а используется повторно при выделениях/освобождениях элементов T. Константа CHUNK_SIZE определена в файле-реализации.
См. определение в файле fix_alloc.hpp строка 77
|
Размер выделяемой под T памяти. Округляем sizeof(T) до sizeof(void*) воизбежание проблем с выравниванием. См. определение в файле fix_alloc.hpp строка 83
00083 { SIZE=(sizeof(T)+sizeof(void*)-1)/sizeof(void*)*sizeof(void*) }; |
|
Выделяет память (размера SIZE) для объекта T. При нехватке памяти будет возбуждено std::bad_alloc. См. определение в файле fix_alloc.hpp строка 89 Перекрестные ссылки fixed_alloc_private::void_alloc< SIZE >::alloc(). Используется в sh_array< T >::Rep::operator new() и sh_ptr< T >::Rep::operator new().
00090 { 00091 return (T*)fixed_alloc_private::void_alloc<SIZE>::alloc(); 00092 } |
|
Освобождает ранее выделенную память. При этом, она не возвращается системе, а остается в списке свободных кусков. Вызов free(0) обрабатывается некорректно (происходит попытка разыменования 0). На самом деле это не является большой проблемой т.к. если с помощью free() реализовать X::operator delete(), то вызов delete (X*)0 не приведет к вызову free(0) -- это гарантируется языком. Проблемы будут только при непосредственном вызове вида X::operator delete(0), что в реальном коде практически не встречается, так что проверка на 0 была опущена для улучшения производительности (в крайнем случае, проверку на 0 можно произвести самостоятельно непосредственно перед вызовом X::operator delete(ptr) или прямо в теле X::operator delete()). См. определение в файле fix_alloc.hpp строка 109 Перекрестные ссылки fixed_alloc_private::void_alloc< SIZE >::free(). Используется в sh_array< T >::Rep::operator delete() и sh_ptr< T >::Rep::operator delete().
00110 { 00111 fixed_alloc_private::void_alloc<SIZE>::free(ptr); 00112 } |