Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
#1

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

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

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

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

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

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

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

Написать программу с объектами из исходного кода - C++
Есть код программы на Borland, нужно переписать эту же программу, но с объектами. За подробностями в ЛС.

Аллокатор в chrome - C++
Всем привет, начал изучать исходники хрома, в аллокаторе, метод realloc должен возвращать nullptr если передаваемый аргумент size равен...

27
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
11.06.2015, 17:42  [ТС] #16
castaway
Вот поэтому я и создал тему на форуме, я не понимаю как сделать аллокатор.
Напишите хотя бы простенький пример, а я спрошу чего не понимаю у вас
Примеры с Интернета вообще не помогли мне
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 17:59 #17
Цитата Сообщение от Helldrg Посмотреть сообщение
Вот поэтому я и создал тему на форуме, я не понимаю как сделать аллокатор.
Без аллокатора пример покажи. Плохой пример, не рабочий, медленный.
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
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 / 43
Регистрация: 25.02.2015
Сообщений: 435
11.06.2015, 21:39 #19
есть такая книжка:
Современное проектирование на C++
Автор: Андрей Александреску

там целая глава посвящена разработке своего аллокатора. детальки, ньюансы и прочее полезное присутствует.
советую ознакомится, будет быстрее чем с форума по немногу от каждого советы парсить.
1
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 21:42 #20
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я опять ничего не понял. Вот тебе пример через 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
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
11.06.2015, 22:05  [ТС] #21
Спасибо большое, а почему pool имеет тип char, почему смещение равняется 16 и что обозначает new() выражение в скобках
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
11.06.2015, 22:14 #22
Цитата Сообщение от Helldrg Посмотреть сообщение
а почему pool имеет тип char
Можно сделать тип A, но тогда оператор new сконструирует 1000000 экземпляров класса A, но этого можно избежать, выделив память через malloc.

Цитата Сообщение от Helldrg Посмотреть сообщение
почему смещение равняется 16
Для наглядности. В данном случае можешь конструировать в любом диапазоне от 0 до 999999.

Цитата Сообщение от Helldrg Посмотреть сообщение
что обозначает new() выражение в скобках
Это называется placement new. Выражение в скобках - адрес, по которому необходимо сконструировать объект(ы).
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.06.2015, 03:56 #23
Цитата Сообщение от castaway Посмотреть сообщение
но тогда оператор new сконструирует 1000000 экземпляров класса
конкретно operator new ничего не сконструирует
Цитата Сообщение от castaway Посмотреть сообщение
но этого можно избежать, выделив память через malloc.
можно использовать именно operator new, а не new-expression
1
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.06.2015, 08:03 #24
Цитата Сообщение от Croessmah Посмотреть сообщение
конкретно operator new ничего не сконструирует
Ок. Сконструирует код, который сконструирует компилятор, который в своё время сконструировал разработчик, которого в своё время сконструировали родители.
Так пойдёт?

Цитата Сообщение от Croessmah Посмотреть сообщение
можно использовать именно operator new, а не new-expression
Можно. А можно и malloc. Это был пример.

Не придирайся.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.06.2015, 17:44 #25
Цитата Сообщение от castaway Посмотреть сообщение
Не придирайся.
просто уточнил, что operator new не вызывает конструкторы. Ничего личного
0
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
14.06.2015, 23:25  [ТС] #26
castaway
Извиняюсь, Интернет пропал в деревне =)
Значит 16 это смещение, что бы в пуле, что бы новый объект записался в свободную память, а не в память предыдущего объекта и в данном случае 16 измеряется в объектах? то есть что бы второй объект записать надо написать так:
C++
1
new((A *)pool + 1)
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.06.2015, 05:49 #27
Да, измеряется в объектах типа A.
Да, чтобы создать второй объект надо (можно) написать так.
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
15.06.2015, 09:39  [ТС] #28
castaway
Спасибо большое, трудную тему помогли разъяснить!!!
0
15.06.2015, 09:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2015, 09:39
Привет! Вот еще темы с ответами:

Пишем аллокатор - C++
дабы не захламлять и так уже захламленную тему про перегрузку операторов создаю новую тему, собственно по поводу аллокаторов прям...

Быстрый аллокатор - C++
Собственно, необходим аллокатор для быстрого выделения памяти под мелкие объекты, совместимый со стандартными контейнерами (std::list и...

Написать класс для работы со временем - C++
В общем, нужно написать класс время, создать перегрузки и так далее. А также сделать &quot;красивый вывод&quot; в поток, типа чч.мм:сс. Так вот,...

Написать программу, демонстрирующую работу с объектами двух типов - C++
Написать программу, демонстрирующую работу с объектами двух типов: Т1 и Т2, для чего создать систему соответствующих классов. Каждый объект...


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

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

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