Диспетчер памяти без веток?

Кто-либо думал о том, как записать диспетчера памяти (в C++), который является полностью бесплатным ответвлением? Я записал пул, стек, очередь и связанный список (выделяющий от пула), но я задаюсь вопросом, как вероятный это должно записать ответвлению свободного общего диспетчера памяти.

Это - все, чтобы помочь сделать действительно допускающую повторное использование платформу для того, чтобы сделать параллельное тело, чтобы ЦП и кэш дружественная разработка.

Править: без веток я имею в виду, не делая прямых или косвенных вызовов функции, и не используя IFS. Я думал, что могу, вероятно, реализовать что-то, что первые изменения требуемый размер для обнуления для ложных вызовов, но действительно не получили намного больше, чем это. Я чувствую, что это не невозможно, но другой аспект этого осуществления затем представляет его на упомянутых "недружелюбных" процессорах, чтобы видеть, стоит ли это попробовать настолько же трудно как это, чтобы не переходить.

6
задан skaffman 31 January 2011 в 22:59
поделиться

1 ответ

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

class Allocator {

    void* malloc(size_t size) {
        int bucket = log2(size + sizeof(int));
        int* pointer = reinterpret_cast<int*>(m_buckets[bucket].back());
        m_buckets[bucket].pop_back();
        *pointer = bucket; //Store which bucket this was allocated from
        return pointer + 1; //Dont overwrite header
    }

    void free(void* pointer) {
        int* temp = reinterpret_cast<int*>(pointer) - 1;
        m_buckets[*temp].push_back(temp);
    }

    vector< vector<void*> > m_buckets;
};

(Вы бы, конечно, также заменили std :: vector простым массивом + счетчиком).

РЕДАКТИРОВАТЬ: Чтобы сделать это устойчивым (т.е. обрабатывать ситуацию, когда ведро пусто), вам нужно будет добавить некоторую форму ветвления.

РЕДАКТИРОВАТЬ2: Вот небольшая функция без ответвлений log2 :

//returns the smallest x such that value <= (1 << x)
int
log2(int value) {
    union Foo {
        int x;
        float y;
    } foo;
    foo.y = value - 1;
    return ((foo.x & (0xFF << 23)) >> 23) - 126; //Extract exponent (base 2) of floating point number
}

Это дает правильный результат для распределения <33554432 байт. Если вам нужно больше ассигнований, вам придется перейти на удвоение.

Вот ссылка на то, как числа с плавающей запятой представлены в памяти.

2
ответ дан 17 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: