Добрый день.
Я попытался написать свой аллоктор памяти (первый раз в жизни). Конечно он работает не так как ожидалось, поэтому появился примерно 1 миллион вопросов.
Собственно вот мой код
и файл аллоктора
1) вот тут строчка inline static long pos {}; , если сделать её просто long pos {}; , то она не будет прирастать тут pos++ , непонятно почему
2) если поставить const long ALL = 400; то вроде как работает, а если const long ALL = 100; то сразу вылетает ошибка
не до конца понятно, что это значит.
В целом, я пытаюсь написать некое подобие линейного аллоктора (не копирую чужой код и не подсматриваю в гугл, ну просто чтобы понять как это делать).
Но видимо у меня еще и ошибка в логике самого алгоритма.
Буду признателен за любые советы.
Я попытался написать свой аллоктор памяти (первый раз в жизни). Конечно он работает не так как ожидалось, поэтому появился примерно 1 миллион вопросов.
Собственно вот мой код
:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <timer.h>
#include <linearallocator.h>
struct ass_i;
const long ALL = 400;
LinearAllocator<ass_i> *_alloc = new LinearAllocator<ass_i>(ALL);
struct ass_i
{
int a{};
double dub{};
void *operator new(size_t v) noexcept
{
return _alloc->allocate(&v);//malloc(v);
}
void operator delete(void *v)
{
_alloc->deallocate(static_cast<ass_i*>(v),16);
}
};
int main()
{
std::vector<ass_i*> _vec{};
while(true)
{
Timer t;
for (long x = 0 ; x < ALL ; x++)
{
ass_i *a = new ass_i();
a->a = x;
_vec.push_back(std::move(a));
}
_alloc->drop();
}
return 0;
}
:
#ifndef LINEARALLOCATOR_H
#define LINEARALLOCATOR_H
#include <cstdlib>
#include <iostream>
#include <ostream>
template <typename T>
class LinearAllocator
{
void *chanck = nullptr;
inline static long pos {};
public:
using value_type = T;
explicit LinearAllocator(long size)
{
chanck = new char[(sizeof(T) * size)];
pos = 0;
std::cout << (sizeof(T) * size) << " " << sizeof(chanck) << " " << pos << std::endl;
}
T* allocate(std::size_t *size)
{
T* ret = static_cast<T*>(::new(&chanck + (sizeof(T) * pos)) T());
pos ++;
//std::cout << "pos " << pos << std::endl;
return ret;
}
void deallocate(T* p,std::size_t)
{
delete p;
//pos--;
}
void drop()
{
pos = 0;
}
};
#endif // LINEARALLOCATOR_H
2) если поставить const long ALL = 400; то вроде как работает, а если const long ALL = 100; то сразу вылетает ошибка
:
10:18:14: Starting /home/vabela/build-Test09-Desktop-Debug/Test09...
1600 8 0
0.01369
0.00454
Fatal glibc error: malloc assertion failure in sysmalloc: (old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)
10:18:14: /home/vabela/build-Test09-Desktop-Debug/Test09 crashed.
В целом, я пытаюсь написать некое подобие линейного аллоктора (не копирую чужой код и не подсматриваю в гугл, ну просто чтобы понять как это делать).
Но видимо у меня еще и ошибка в логике самого алгоритма.
Буду признателен за любые советы.