Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

allocator - C++

27.07.2013, 06:18. Просмотров 1696. Ответов 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.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 06:18     allocator
Посмотрите здесь:

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

std::allocator - C++
Здравствуйте! Подскажите почему возникает ошибка сегментирования: using std::cout; using std::endl; int main() { ...

Ошибка с allocator - C++
Приветствую. Пользуюсь Dev-C++. При выполнении кода, ошибка, что на скрине. #include &lt;iostream&gt; int main() { ...

allocator своя версия - C++
Доброго времени суток. Мне нужно написать class allocator на подобии стандартного. Он должен содержать следующие методы: Method void*...

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

Лямбда-выражение, allocator + destroy - C++
Подскажите в чем ошибка пожалуйста( отказывается выполнять функцию destroy: std::allocator&lt;std::string&gt;&amp; newAlloc = alloc; ...

Allocator sts&boost - C++
Возникла проблема при обработке больших потоков данных. Данные представляют из себя пакеты из сети разного размера. Профайлер показал,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.07.2013, 09:20     allocator #2
Это специализация. Для типа void. Объектов типа void быть не может, поэтому, естественно, в этой специализации нет никаких методов для выделения памяти.

Берёте документацию и реализуете аналогичный интерфейс. Это не особо сложно, если вы знаете, что такое пул памяти и placement new.
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.07.2013, 11:52     allocator #3
allocator своя версия
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
27.07.2013, 12:17  [ТС]     allocator #4
OhMyGodSoLong, А я от нашол прикольный сайт http://ru.cppreference.com/w/ токо на русском документация все переведено как я его раньше не находил, теперь тут буду зависать, а то мучился. От по алокатору переведена http://ru.cppreference.com/w/cpp/memory/allocator и не паришся с английским .
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.07.2013, 12:28     allocator #5
ninja2, там машинный перевод)))

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

Не по теме:

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

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

ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
28.07.2013, 12:03  [ТС]     allocator #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;
}
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
28.07.2013, 13:34     allocator #8
ninja2, У мап как бэ третьим параметром идет компаратор (по дефолту std::less<Key>), а аллокатор идет четвертым.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2013, 02:39     allocator
Еще ссылки по теме:

Std::allocator<wchar_t>>' to 'LPCWSTR' - C++
собственно есть list&lt;wstring&gt; куда вставили много адресов типа L&quot;D:\\66\\99&quot;; Задача удалять папки по этому адресу (пока что папки пусты...

Что такое std::allocator<T> ? - C++
я так понял возвращает адрес чего то?

Работа с allocator (управление памятью) - C++
Нормальной инфы на русском языке я так и не нашел в инете( про него читал в книге Программирование принципы и практика С++ Страуструп, но...

Для чего существуют allocator-и - C++
Привет, опять я... Очерeдный вопрос: Для чего существует allocator и как он используется? прочитал по англисский но как то не понял...

allocator, при компиляции ошибка - C++
template&lt;class T&gt; class Vec { public: ... private: allocator&lt;T&gt; alloc; ... }


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

Или воспользуйтесь поиском по форуму:
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
29.07.2013, 02:39  [ТС]     allocator #9
Цитата Сообщение от Olivеr Посмотреть сообщение
там машинный перевод)))
лучше машинный чем никакой.
Yandex
Объявления
29.07.2013, 02:39     allocator
Ответ Создать тему
Опции темы

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