Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
#1

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

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

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

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

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2015, 00:55
Ответы с готовыми решениями:

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

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

Написать программу для проверки работы процедуры ScalarProduct для вычисления скалярного произведения двух векторов
Написать программу для проверки работы процедуры ScalarProduct для вычисления...

Написать программу с объектами из исходного кода
Есть код программы на Borland, нужно переписать эту же программу, но с...

на с++ нужно написать функцию с глобальными объектами
пишу сюда впервые нужно написать программу для вычисления температуры смеси...

27
Croessmah
++Ͻ
14365 / 8147 / 1533
Регистрация: 27.09.2012
Сообщений: 20,082
Записей в блоге: 3
Завершенные тесты: 1
11.06.2015, 01:01 #2
Можете использовать/исследовать готовый:
http://www.boost.org/doc/libs/1_58_0/libs/pool/doc/html/index.html
Викиучебник: Boost.Pool
0
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
11.06.2015, 01:09  [ТС] #3
Просто я в этой теме не очень разбираюсь
Вот например: память под объекты какой командой выделяются и освобождаются
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
11.06.2015, 11:31 #4
new delete) пишем аллокатор, переопределяем методы new delete для класса
0
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
11.06.2015, 15:34  [ТС] #5
Я читал на хабре, что аллокаторы выигрывают в скорости в некоторых случаях по сравнению с new
aLarman
а как написать его =)
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 15:43 #6
Helldrg, я просто поинтересуюсь... У тебя где-то очень медленно выделяется память?
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
11.06.2015, 15:55 #7
Цитата Сообщение от Helldrg Посмотреть сообщение
а как написать его =)
да как угодно, говорите ему, мне надо 100500 байт, он окей вот отсюда бери, и вернет указатель, ну а потом placement new и готово
а как аллокатор память будет держать, ды как угодно, выделять по over 100500Кб памяти за раз например, ну или вообще стат кусок держать, это уж как Вы решите
castaway, смешно
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 16:08 #8
Цитата Сообщение от aLarman Посмотреть сообщение
castaway, смешно
Я серьёзно Просто я сильно сомневаюсь что у него именно с этим проблемы, если только его программа больше ничего не делает, кроме как выделяет и освобождает память.
0
aLarman
11.06.2015, 16:47
  #9

Не по теме:

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

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

Добавлено через 1 минуту
aLarman
Вы уж извините, может я конечно ошибаюсь, я считаю для этого аллокатор и придумали, не просто же так он существует
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 17:00 #11
Helldrg, пул (он же pool) - это заранее выделенный большой кусок памяти для большого количества объектов. Для его выделения можно использовать хоть malloc, хоть new.
Если размещаемые в нём объекты будут являться классовыми типами - тогда placement new (как говорил выше aLarman).
Иначе, просто копируй туда необходимые данные.
0
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
11.06.2015, 17:09  [ТС] #12
castaway
А вы бы не могли бы рассказать как это все делается
1) я так понял разницы не чем память выделять malloc c и new с++
2)Аллокатор в виде класса делать надо? Если да то какие функции должны быть
3)если можно функции описать из чего состоять должны
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 17:16 #13
Всё зависит от того, как ты это собираешься использовать, по этому пока не вижу смысла отвечать на эти вопросы.
Покажи как ты себе это представляешь (какие объекты, как много, для чего).
1
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
11.06.2015, 17:30  [ТС] #14
У меня несколько уровней, в которых создаются объекты. После конца уровня, этот участок не освобождается(или должен освобождаться я не знаю), а новый уровень начинает грузиться в эту же память. Так можно гарантировать, что после работы в течение многих часов не будет проблем с памятью. А в самом конце все это дело, удаляется. Вот этот аллокатор неверно можно назвать менеджером памяти.
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 17:38 #15
Я мало чего понял. Нужен пример где у тебя это не получается.
1
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
11.06.2015, 17:42  [ТС] #16
castaway
Вот поэтому я и создал тему на форуме, я не понимаю как сделать аллокатор.
Напишите хотя бы простенький пример, а я спрошу чего не понимаю у вас
Примеры с Интернета вообще не помогли мне
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 17:59 #17
Цитата Сообщение от Helldrg Посмотреть сообщение
Вот поэтому я и создал тему на форуме, я не понимаю как сделать аллокатор.
Без аллокатора пример покажи. Плохой пример, не рабочий, медленный.
1
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
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
Perfilov
264 / 164 / 56
Регистрация: 25.02.2015
Сообщений: 435
11.06.2015, 21:39 #19
есть такая книжка:
Современное проектирование на C++
Автор: Андрей Александреску

там целая глава посвящена разработке своего аллокатора. детальки, ньюансы и прочее полезное присутствует.
советую ознакомится, будет быстрее чем с форума по немногу от каждого советы парсить.
1
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
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
11.06.2015, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2015, 21:42

Написать класс для работы со временем
В общем, нужно написать класс время, создать перегрузки и так далее. А также...

Написать класс , объектами которого являются матрицы размера 3 х 3
Написать класс , объектами которого являются матрицы размера 3 х 3, для этого...

Написать программу, демонстрирующую работу с объектами двух типов
Написать программу, демонстрирующую работу с объектами двух типов: Т1 и Т2, для...


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

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

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