Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите как написать пуловый аллокатор для работы с объектами
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.06.2015, 00:55
Ответы с готовыми решениями:

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

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

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

27
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
11.06.2015, 01:01
Можете использовать/исследовать готовый:
http://www.boost.org/doc/libs/... index.html
Викиучебник: Boost.Pool
0
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 01:09  [ТС]
Просто я в этой теме не очень разбираюсь
Вот например: память под объекты какой командой выделяются и освобождаются
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.06.2015, 11:31
new delete) пишем аллокатор, переопределяем методы new delete для класса
0
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
11.06.2015, 15:34  [ТС]
Я читал на хабре, что аллокаторы выигрывают в скорости в некоторых случаях по сравнению с new
aLarman
а как написать его =)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2015, 15:43
Helldrg, я просто поинтересуюсь... У тебя где-то очень медленно выделяется память?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.06.2015, 15:55
Цитата Сообщение от Helldrg Посмотреть сообщение
а как написать его =)
да как угодно, говорите ему, мне надо 100500 байт, он окей вот отсюда бери, и вернет указатель, ну а потом placement new и готово
а как аллокатор память будет держать, ды как угодно, выделять по over 100500Кб памяти за раз например, ну или вообще стат кусок держать, это уж как Вы решите
castaway, смешно
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2015, 16:08
Цитата Сообщение от aLarman Посмотреть сообщение
castaway, смешно
Я серьёзно Просто я сильно сомневаюсь что у него именно с этим проблемы, если только его программа больше ничего не делает, кроме как выделяет и освобождает память.
0
11.06.2015, 16:47

Не по теме:

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

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

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

Добавлено через 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
есть такая книжка:
Современное проектирование на C++
Автор: Андрей Александреску

там целая глава посвящена разработке своего аллокатора. детальки, ньюансы и прочее полезное присутствует.
советую ознакомится, будет быстрее чем с форума по немногу от каждого советы парсить.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2015, 21:42
Лучший ответ Сообщение было отмечено 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.06.2015, 21:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru