Кто-либо думал о том, как записать диспетчера памяти (в C++), который является полностью бесплатным ответвлением? Я записал пул, стек, очередь и связанный список (выделяющий от пула), но я задаюсь вопросом, как вероятный это должно записать ответвлению свободного общего диспетчера памяти.
Это - все, чтобы помочь сделать действительно допускающую повторное использование платформу для того, чтобы сделать параллельное тело, чтобы ЦП и кэш дружественная разработка.
Править: без веток я имею в виду, не делая прямых или косвенных вызовов функции, и не используя IFS. Я думал, что могу, вероятно, реализовать что-то, что первые изменения требуемый размер для обнуления для ложных вызовов, но действительно не получили намного больше, чем это. Я чувствую, что это не невозможно, но другой аспект этого осуществления затем представляет его на упомянутых "недружелюбных" процессорах, чтобы видеть, стоит ли это попробовать настолько же трудно как это, чтобы не переходить.
Хотя я не думаю, что это хорошая идея, одним из решений было бы иметь заранее выделенные сегменты различных журналов 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 байт. Если вам нужно больше ассигнований, вам придется перейти на удвоение.
Вот ссылка на то, как числа с плавающей запятой представлены в памяти.