Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
1

allocator

27.07.2013, 06:18. Просмотров 2052. Ответов 8
Метки нет (Все метки)

Здорова!
Есть задачка:"Завершите или реализуйте с самого начала Pool_alloc (параграф 19.4.2) так, чтобы обеспечивались все возможности стандартного аллокатора allocator (параграф 19.4.1) из стандартной библиотеки. Сравните производительности Pool_alloc и allocator, чтобы решить, стоит ли использовать Pool_alloc в вашей системе."

Нашол я класс определение класса allocator.
C++
1
2
3
4
5
6
7
template <> class allocator<void> {
public:
  typedef void* pointer;
  typedef const void* const_pointer;
  typedef void value_type;
  template <class U> struct rebind { typedef allocator<U> other; };
};
А где посмотреть его реализацию полностью или это она и есть просто типы? Да тяжелая задачка.
Это вообще значок <> означает специализация шаблона, походу это не весь шаблон. Кто не знает аллокатор память должен выделять, перегружая оператор new.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2013, 06:18
Ответы с готовыми решениями:

Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct
Компилятор: MSVC 2010 Exress код моего класса распределяющего память под спойлером #include...

std::allocator
я не смог найти хорошего описания роботы с аллокатором, так что спрашиваю у тех, кто с ним работал...

Allocator и shared_ptr
Прокомментируйте пожалуйста. Есть ли смысл и вообще возможность оформлять зарезервированную память...

std::allocator
Здравствуйте! Подскажите почему возникает ошибка сегментирования: using std::cout; using...

8
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.07.2013, 09:20 2
Это специализация. Для типа void. Объектов типа void быть не может, поэтому, естественно, в этой специализации нет никаких методов для выделения памяти.

Берёте документацию и реализуете аналогичный интерфейс. Это не особо сложно, если вы знаете, что такое пул памяти и placement new.
1
413 / 409 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.07.2013, 11:52 3
allocator своя версия
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
27.07.2013, 12:17  [ТС] 4
OhMyGodSoLong, А я от нашол прикольный сайт http://ru.cppreference.com/w/ токо на русском документация все переведено как я его раньше не находил, теперь тут буду зависать, а то мучился. От по алокатору переведена http://ru.cppreference.com/w/cpp/memory/allocator и не паришся с английским .
0
413 / 409 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.07.2013, 12:28 5
ninja2, там машинный перевод)))

Добавлено через 1 минуту
И тому подтверждение
Шаблон std::allocator класса по умолчанию Allocator используется всеми стандартными контейнерами библиотеки, если не указанное пользователем распределителя обеспечивается.
0
0x10
27.07.2013, 12:50
  #6

Не по теме:

Olivеr, а это чем не машинный перевод?

Цитата Сообщение от ninja2 Посмотреть сообщение
токо на русском документация все переведено как я его раньше не находил

6
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
28.07.2013, 12:03  [ТС] 7
Набрал код из книги пытаюсь запустить вектор и map со своим аллокатором но ничего не работает, для вектора вроде rebind не определен в шаблоне, а для map ошибка: "c:\program files\microsoft visual studio 10.0\vc\include\map(213): error C2064: результатом вычисления фрагмента не является функция, принимающая 2 аргументов"

Нужно доработать Pool_allocator и протестить для vector и map чтоб работал!!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//Pool_alloc
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
#include <map>
using std::map;
#include <string>
using std::string;
#include <utility>
using std::pair;
 
class Pool
{
    struct Link{Link* next;};
 
    struct Chunk
    {
        enum{size=8*1024-16};//слегка менше 8К, чтобы кусок памяти умещался в 8К
        char mem[size];//для достижения точного выравнивания
        Chunk* next;
    };
 
    Chunk* chunks;
    const unsigned int esize;
    Link* head; 
    Pool (Pool&); //защита от копирования
    void operator=(Pool&);//защита от копирования
    void grow();//увеличить пул
 
public:
    Pool(unsigned int n);//n это размер элементов
    ~Pool();
 
    void* alloc();//выделить память под один элемент
    void free(void* b);//возвращение элемента в пул
};
 
inline void* Pool::alloc()
{
    if(head==0)grow();
    Link* p=head;//вернуть первый элемент
    head=p->next;
    return p;
}
 
inline void Pool::free(void* b)
{
    Link* p=static_cast<Link*>(b);
    p->next=head;
    head=p;
}
 
Pool::Pool(unsigned int sz)
    :esize(sz<sizeof(Link)?sizeof(Link):sz)
{
    head=0;
    chunks=0;
}
 
Pool::~Pool()//освободить все куски (chunks)
{
    Chunk* n=chunks;
    while(n)
    {
        Chunk* p=n;
        n=n->next;
        delete p;
    }
}
 
void Pool::grow()//выделяет новый 'chunk', организуя его в виде связанного
    //списка элементов размером 'esize'
{
    Chunk* n=new Chunk;
    n->next=chunks;
    chunks=n;
 
    const int nelem=Chunk::size/esize;
    char* start=n->mem;
    char* last=&start[(nelem-1)*esize];
 
    for(char*p=start;p<last;p+=esize)
        reinterpret_cast<Link*>(p)->next=reinterpret_cast<Link*>(p+esize);
 
    reinterpret_cast<Link*>(last)->next=0;
    head=reinterpret_cast<Link*>(start);
}
 
template<class T> class Pool_alloc
{
private:
    static Pool mem;//пул элементов размером sizeof(T)
 
public:
    //аналогично стандартному аллокатору(19.4.1)
    typedef unsigned int size_type;
    typedef T* pointer;
 
    Pool_alloc();
    T* allocate(size_type,void*);
    void deallocate(pointer p,size_type n);
};
 
//инициализация статического члена
template<class T> Pool Pool_alloc<T>::mem(sizeof(T));
 
template<class T> Pool_alloc<T>::Pool_alloc(){}
 
template<class T>
T* Pool_alloc<T>::allocate(size_type n,void* k)
{
    if(n==1)return static_cast<T*>(mem.alloc());
    //...
}
 
template<class T>
void Pool_alloc<T>::deallocate(pointer p,size_type n)
{
    if(n==1)
    {
        mem.free(p);
        return;
    }
    //...
}
 
int main()
{
    cout <<"Pool alloc"<<endl;
    //vector<int,Pool_alloc<int> >v;
    map<string,int,Pool_alloc<pair<const string,int> > >m;
    m["hellow"]=33;
    //m["world"]=40;
    //cout <<m["hellow"]<<m["world"]<<endl;
 
    return 0;
}
0
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
28.07.2013, 13:34 8
ninja2, У мап как бэ третьим параметром идет компаратор (по дефолту std::less<Key>), а аллокатор идет четвертым.
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
29.07.2013, 02:39  [ТС] 9
Цитата Сообщение от Olivеr Посмотреть сообщение
там машинный перевод)))
лучше машинный чем никакой.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2013, 02:39

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка с allocator
Приветствую. Пользуюсь Dev-C++. При выполнении кода, ошибка, что на скрине. #include...

allocator своя версия
Доброго времени суток. Мне нужно написать class allocator на подобии стандартного. Он должен...

Vector allocator SQLite
Гуру, помогите новичку! Столкнулся с проблемой, и даже не понимаю в чем она... Надо: сделать...

allocator std::map
Подскажите вопрос, есть тестовое задание: Подскажите где про это почитать и разъясните...

Рееализация Heap Allocator
Мне нужно написать HeapAllocator. Что мне нужно: У меня есть haeder в котором в первом левом бите...

Лямбда-выражение, allocator + destroy
Подскажите в чем ошибка пожалуйста( отказывается выполнять функцию destroy: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.