LINUX.ORG.RU

Свои аллоокаторы


0

1

В образовательных целях решил разобраться как работают аллокаторы, возник не большой вопрос, допустип я хочу сделать самый простой аллокатор, который будет выделать память линейно:

typedef struct _LinearBuffer {
	uint8_t *mem;       /*!< Pointer to buffer memory. */
	uint32_t totalSize; /*!< Total size in bytes. */
	uint32_t offset;    /*!< Offset. */
} LinearBuffer;

/* non-aligned allocation from linear buffer. */
void* linearBufferAlloc(LinearBuffer* buf, uint32_t size) {
	//
	if (!buf | !size) return 0;
	
	uint32_t newOffset = buf->offset + size;
	
	if (newOffset <= buf->totalSize) {
		void* ptr = buf->mem + buf->offset;
		buf->offset = newOffset;
		return ptr;
	}
	
	return 0; /* out of memory */
}

здесь мне все понятно, кроме одного, как мне использовать буффер, и каким должно быть значение totalSize, получается что titalSize - это размер моей виртуальной памяти, и для всех аллокаторов он одинаков? или же разбивать мою виртуальную память на буфферы определенного размера?

★★★

Какой ужас. Мало ипучегоГорбатогоКейса, того, что вместо size_t используется uint32_t, а вместо логического «или» - побитовое, так еще и сам вопрос выдает полное непонимание задачи.

и каким должно быть значение totalSize

Сколько памяти выделил, таким и должно быть значение. Как ты ее выделил, кстати?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

Растягивать сегмент кучи по мере необходимости. Читай TLPI и man (s)brk.

d_a ★★★★★
()

Обычно держат массив списков буфферов разного размера (логарифмическая шкала).

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

а все, кажется понял, получается можно вручную все делать, и задавать нужный размер буфера, либо писать свой менеджер памяти? а вот собственно вопрос тогда, я допустим через свой аллокатор выделил под динамический массив место, вернул он мне смещенный указатель, так вот, не перезапишутся ли мои данные, когда я объявлю новую дюбую переменную на тот адрес?

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

или мне еще при этом нужно будет вручную через асм смещать указатель на вершину стека?

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

как мне использовать буффер

Например:

http://en.wikipedia.org/wiki/Memory_pool http://en.wikipedia.org/wiki/Buddy_memory_allocation http://stackoverflow.com/questions/11905880/implement-a-user-defined-malloc-f...

получается что titalSize - это размер моей виртуальной памяти, и для всех аллокаторов он одинаков?

Память надо где-то взять, можно работать поверх malloc, можно взять напрямую у ОС с помощью mmap.

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

alloca выделяет память на стеке. После возврата из функции, которая вызвала alloca, выделенную память использовать будет нельзя.

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

ничего ты не понял. Что по-твоему менеджер памяти как не аллокатор? Возьми лучше книжку, там есть про это параграф: Computer Systems. A Programmer's Perspective. Randal E. Bryant.

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

от malloc хочется отказаться пока, попробую через mmap )

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

спасибо за книжку, почитаю

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

вот сделал я пуловый аллокатор памяти, в прицнипе все понятно, кроме одного, получается чтобы выделить память под класс, допустим в 32 байта, нужно смотреть изначально подходящий буффер с размером чанков, чтобы класс мог поместиться в него?

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