Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрое выделение памяти для нескольких объектов, Выделение памяти оптом? 
:(
    Опции темы
slavindo
Дата 29.3.2003, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 29.3.2003

Репутация: нет
Всего: нет



Такой вопрос: при открытии документа у меня создаются сотни тысяч однотипных объектов (одинаковых или порождённых от общего родителя). Оптимизация этой процедуры упёрлась в тот факт, что сотни тысяч операторов new для CObjecta занимают огромное время! Не знают ли уважаемые участники конференции, как сократить это время, или может в VC++ есть возможность выделить память оптом для нескольких объектов?
PM MAIL   Вверх
Step
Дата 30.3.2003, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Гетмем - может выделить тебе память сразу под все объекты, но он не произведет инициализацию объектов, к тамуже тебе предется еще и распределять указатели
Цитата
при открытии документа у меня создаются сотни тысяч однотипных объектов (одинаковых или порождённых от общего родителя). Оптимизация этой процедуры упёрлась в тот факт, что сотни тысяч
ты бы подумал над улучшением концепции своей программы


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Paradox
Дата 2.4.2003, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



А зачем ты наследуешь от CObject? Может можно без этого обойтись?


--------------------
---
PM MAIL WWW   Вверх
man2002ua
Дата 2.4.2003, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



Цитата
ты бы подумал над улучшением концепции своей программы

Это наилучший совет.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Step
Дата 2.4.2003, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата
Это наилучший совет.
спасибо за оценку


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Fantasist
Дата 2.4.2003, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Не знают ли уважаемые участники конференции, как сократить это время, или может в VC++ есть возможность выделить память оптом для нескольких объектов?


В принципе стандартный менеджер памяти и так выделяет память скопом, а потом ее распределяет. Так же нет никакой уверенности, что наибольшее занимаемое время приходиться на оператор new, а не на конструирование объектов.
Однако же, вполне реально и самому написать менеджер памяти, и в С++ для этого возможности есть. Наиболее быстрой работа будет с памятью выделенной в стеке или же в сегменте данных, например:

Код

class MemManager
{
char memPool[10000];
int position;

public:
MemManager(): position(0) {};
~MemManager() {};

void* alloc_new(size_t size)
{
             void* result=memPool+position;
                            position+=size;
                            return result;
};
};

static MemManager mng;

void* operator new(size_t size)
{
return mng.alloc_new(size);
};



Глобальная перегрузка new крайне не реккомендуется, но идея та же: выделяем память из заранее выделенного куска памяти. Конечно, надо так же позаботиться о вызове конструктора ( чаще всего это делается с помощью placement new - A* a=new (a) A;), освобождении памяти и вызове деструктора (это уже проще - деструктор вызывается как функция).


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Paradox
Дата 3.4.2003, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



А я вообще все эти аллоки-маллоки не люблю почему-то


--------------------
---
PM MAIL WWW   Вверх
Step
Дата 3.4.2003, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата
время приходиться на оператор new
к стати это можно проверить используя профайлз запуск


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
slavindo
Дата 5.4.2003, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 29.3.2003

Репутация: нет
Всего: нет



Цитата(Step @ 3.4.2003, 01:34)
к стати это можно проверить используя профайлз запуск

Отмечу, что профайлер мы уже запускали, поэтому и спрашиваю я именно про оператор new. А что касается улучшения концепции программы, то заменить эти тысячи объектов на один - никак не выходит - уж больно они нужны smile.gif Насчёт CObjecta - хорошая идея, но он используется для организации стандартных контейнеров и сериализации.
А за ответы - спасибо!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.