#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(). Используется в StringBuf_private::Node< std::string >::operator new(), 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(). Используется в StringBuf_private::Node< std::string >::operator delete(), sh_array< T >::Rep::operator delete() и sh_ptr< T >::Rep::operator delete().
00110 {
00111 fixed_alloc_private::void_alloc<SIZE>::free(ptr);
00112 }
|
1.3