Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
1

Как написать пуловый аллокатор для работы с объектами

11.06.2015, 00:55. Показов 3267. Ответов 27
Метки нет (Все метки)

Здравствуйте! Подскажите как написать пуловый аллокатор для работы с объектами
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2015, 00:55
Ответы с готовыми решениями:

Какие существуют классы для работы с 3D объектами
Нужно нарисовать октаэдр, посредством OpenGL это несложно а вот не пользуясь библиотекой как то...

Перегрузка арифметических операций для работы с объектами классов.
Создать класс Animal, содержащий следующие элементы: - поле «вес» float Mass; - поле «пол» ...

Реализуйте интерфейс динамической структуры list для работы с объектами класса А
Добрый день товарищи программисты. Столкнулся с задачей и никак не могу решить... Так вот...

Написать программу для библиотеки с классами и объектами
Реализовать работу библиотеки (книга, автор, читатель, прокат). Напишите программу в стиле ООП,...

27
Don't worry, be happy
17176 / 10058 / 1936
Регистрация: 27.09.2012
Сообщений: 25,059
Записей в блоге: 1
11.06.2015, 01:01 2
Можете использовать/исследовать готовый:
http://www.boost.org/doc/libs/... index.html
Викиучебник: Boost.Pool
0
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 01:09  [ТС] 3
Просто я в этой теме не очень разбираюсь
Вот например: память под объекты какой командой выделяются и освобождаются
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.06.2015, 11:31 4
new delete) пишем аллокатор, переопределяем методы new delete для класса
0
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 15:34  [ТС] 5
Я читал на хабре, что аллокаторы выигрывают в скорости в некоторых случаях по сравнению с new
aLarman
а как написать его =)
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.06.2015, 15:43 6
Helldrg, я просто поинтересуюсь... У тебя где-то очень медленно выделяется память?
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.06.2015, 15:55 7
Цитата Сообщение от Helldrg Посмотреть сообщение
а как написать его =)
да как угодно, говорите ему, мне надо 100500 байт, он окей вот отсюда бери, и вернет указатель, ну а потом placement new и готово
а как аллокатор память будет держать, ды как угодно, выделять по over 100500Кб памяти за раз например, ну или вообще стат кусок держать, это уж как Вы решите
castaway, смешно
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.06.2015, 16:08 8
Цитата Сообщение от aLarman Посмотреть сообщение
castaway, смешно
Я серьёзно Просто я сильно сомневаюсь что у него именно с этим проблемы, если только его программа больше ничего не делает, кроме как выделяет и освобождает память.
0
aLarman
11.06.2015, 16:47
  #9

Не по теме:

castaway, собсно к тому же и веду, надо сделать, не потому что медленно работает, а потому что надо

0
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 16:49  [ТС] 10
castaway
Мне нужно часто создавать большое количество, объектов по мере работы (одинакового размера) и удалять лишние, для этого, как я понял нужен пуловый аллокатор.
Погуглив я нашел примеры с аллокаторами, но не разобрался в них, вот решил задать вопрос на форуме, может быть знающие объяснят по этапно на пальцах как сделать его.

Добавлено через 1 минуту
aLarman
Вы уж извините, может я конечно ошибаюсь, я считаю для этого аллокатор и придумали, не просто же так он существует
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.06.2015, 17:00 11
Helldrg, пул (он же pool) - это заранее выделенный большой кусок памяти для большого количества объектов. Для его выделения можно использовать хоть malloc, хоть new.
Если размещаемые в нём объекты будут являться классовыми типами - тогда placement new (как говорил выше aLarman).
Иначе, просто копируй туда необходимые данные.
0
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 17:09  [ТС] 12
castaway
А вы бы не могли бы рассказать как это все делается
1) я так понял разницы не чем память выделять malloc c и new с++
2)Аллокатор в виде класса делать надо? Если да то какие функции должны быть
3)если можно функции описать из чего состоять должны
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.06.2015, 17:16 13
Всё зависит от того, как ты это собираешься использовать, по этому пока не вижу смысла отвечать на эти вопросы.
Покажи как ты себе это представляешь (какие объекты, как много, для чего).
1
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 17:30  [ТС] 14
У меня несколько уровней, в которых создаются объекты. После конца уровня, этот участок не освобождается(или должен освобождаться я не знаю), а новый уровень начинает грузиться в эту же память. Так можно гарантировать, что после работы в течение многих часов не будет проблем с памятью. А в самом конце все это дело, удаляется. Вот этот аллокатор неверно можно назвать менеджером памяти.
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.06.2015, 17:38 15
Я мало чего понял. Нужен пример где у тебя это не получается.
1
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 17:42  [ТС] 16
castaway
Вот поэтому я и создал тему на форуме, я не понимаю как сделать аллокатор.
Напишите хотя бы простенький пример, а я спрошу чего не понимаю у вас
Примеры с Интернета вообще не помогли мне
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.06.2015, 17:59 17
Цитата Сообщение от Helldrg Посмотреть сообщение
Вот поэтому я и создал тему на форуме, я не понимаю как сделать аллокатор.
Без аллокатора пример покажи. Плохой пример, не рабочий, медленный.
1
28 / 57 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 21:22  [ТС] 18
Я сейчас с телефона смотрю, отвечу как за компьютер сяду

Добавлено через 10 минут
If(id ==0)
{
a = new ClassA(1000);
for(int i = 0;i <1000;i++)
{
a = Init(i);
}

}else if(id == 1){

И тд

}
Извиняюсь за краткость, я в деревне, компьютер не ловит связь,а с телефона не удобна набирать
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
11.06.2015, 21:39 19
есть такая книжка:
Современное проектирование на C++
Автор: Андрей Александреску

там целая глава посвящена разработке своего аллокатора. детальки, ньюансы и прочее полезное присутствует.
советую ознакомится, будет быстрее чем с форума по немногу от каждого советы парсить.
1
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.06.2015, 21:42 20
Лучший ответ Сообщение было отмечено Helldrg как решение

Решение

Я опять ничего не понял. Вот тебе пример через placement new. Изучай.
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
#include <iostream>
 
struct A {
    A() {
        std::cout << "construct A at " << (void *)this << std::endl;
    }
 
    ~A() {
        std::cout << "destruct A at " << (void *)this << std::endl;
    }
};
 
int main()
{
    // выделяем пул под миллион обектов A
    char * pool = new char [1000000 * sizeof( A )];
 
    // выводим адрес пула
    std::cout << "Address of pool: " << (void *)pool << std::endl;
 
    // конструируем 10 объектов типа A по смещению 16 от начала пула
    // нет необходимости выделять память, она уже выделена
    A * p = new ( (A *)pool + 16 ) A [10];
 
    // деструкторы сконструированных объектов придётся вызывать явно
    for ( int i = 0; i < 10; ++i ) {
        p++->~A();
    }
 
    // освобождаем пул
    delete [] pool;
 
    return 0;
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Address of pool: 0x418020
construct A at 0x418030
construct A at 0x418031
construct A at 0x418032
construct A at 0x418033
construct A at 0x418034
construct A at 0x418035
construct A at 0x418036
construct A at 0x418037
construct A at 0x418038
construct A at 0x418039
destruct A at 0x418030
destruct A at 0x418031
destruct A at 0x418032
destruct A at 0x418033
destruct A at 0x418034
destruct A at 0x418035
destruct A at 0x418036
destruct A at 0x418037
destruct A at 0x418038
destruct A at 0x418039
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2015, 21:42

Написать программу для работы в магазине торгующем телефонами. Для работы с данными использовать структуру типа ' запись '
Ребята помогите сделать 1. Написать программу для работы в магазине торгующем телефонами. Для...

Написать пакет классов для работы с деловой графикой, предназначенный для работы в среде Windows
Написать пакет классовдля работы с деловой графикой, предназначенный для работы в среде Windows....

Как написать библиотеку для работы с сокетами?
Всем привет. Я написал программу клиент-сервер,передающую некий буфер серверу. Теперь хочу сделать...

Как написать Web приложение для работы по локальной сети
Всем привет уважаемые программисты!!! Недавно начал изучать C# для Windows Form. Хочу написать Web...


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

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

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