?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Next Entry
С++ fixed size allocator
nyaload
_winnie
Оказывается, я могу написать простейший fixed-size аллокатор быстрее, чем компилируется проект под boost. Старая закалка разработчика игр!


#include <stdlib.h> const int SIZE = 256; void *first_free = NULL; void new_block() { const int LARGE_BLOCK_SIZE = 1024*1000; char *block = (char*)malloc(LARGE_BLOCK_SIZE); const int N_BLOCKS = LARGE_BLOCK_SIZE / SIZE; for (int i = 0; i < N_BLOCKS; ++i) { *(void**)(block + i * SIZE) = (i != N_BLOCKS - 1) ? (block + (i+1) * SIZE) : NULL; } first_free = block; } void *fixed_alloc() { if (!first_free) new_block(); void *result = first_free; first_free = *(void **)first_free; return result; } void fixed_free(void *ptr) { *(void**)ptr = first_free; first_free = ptr; }
_Winnie C++ Colorizer

Tags:


  • 1
А указёр в первых байтах возвращаемого блока на следующий пользователь сам учитывать/пропускать будет? :)

А он не нужен :P

Я часто видел аллокаторы, где почему-то автор хранит служебную информацию перед блоком. А она не нужна.

Ок, ты прав, для фиксед всё так.

#include <stdio.h>

int main() {
    void *a1 = fixed_alloc();
    void *a2 = fixed_alloc();
    void *a3 = fixed_alloc();
    
    fixed_free(a2);
    
    void *a4 = fixed_alloc();
    
    printf("%p\n", a1);
    printf("%p\n", a2);
    printf("%p\n", a3);
    printf("%p\n", a4);
}


- А вы с какой скоростью печатать можете?
- Да хоть шестьсот знаков в секунду! Только такая херня получается...

Malloc и Си++. Не, ну я еще понимаю, когда люди вдруг решают, что им очень нужен realloc, а вектор использовать не позволяет религия.

Это же фиксед сайз аллокатор. Как вы здесь собрались new использовать и для чего?

У вас С++ головного мозга!

Это не С++.
В С++ нет stdlib.h.
Автор пишет на сраной Сишечке.

прости, с ходу не понял: как ты маркируешь занятость блока?

Ну там список свободных блоков же. Выделяем из головы, возвращаем в голову. На фига занятость-то?

Я маркирую незанятость блока тем, что он находится в списке.

Занятость блока маркируется тем, что в списке его нет (и нет требований к маркировке в его содержимом).

Так же можно завести списки например для всех часто встречающихся размеров в программе, или с экспоненциальном шагом, напр. 8 16 32 ... байт.

нитпик g++ -O3 версии >4.1 может не любитЪ строку *(void**)ptr = first_free; раз уж ты такой быстрый догадайся почему сам ;)
жаловаться не будет, будет падать в рантайме.

блин нельзя с утра до завтрака код читать :)
в реальном коде проблема вылезла в строке first_free = *(void **)first_free; но с точки зрения правил языка там тоже самое

  • 1