![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| A.V.N. |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 22.11.2005 Репутация: нет Всего: нет |
Добрый день
Жизнь заставила взяться за нестандартное управление памятью. Проекты стали большие, ввиду активного управления памятью стали какие-то хвосты появляться... Ввиду того, что я предпочитаю велосипеды собственного изобретения Работать с ним достаточно просто:
В общем, много там всего есть Данная схема позволяет переопределить операторы new и delete - пробовал, работает "Нестандартность" заключается в следующем: память берется не из "кучи", а распределяется блоками различных размеров. При очистке памяти блок остается, только удаляется метка о том, что он занят. Т. е. удаление происходит очень быстро. Да и распределение, в общем-то, тоже. Таким образом, идеально подходит для случаев, где память "тасуется" - часто удаляется и распределяется. Всего 5 типов пулов памяти: для объектов 4б, 64б, 256б, 32 Кб и 16 Мб (соответственно, в каждом пуле выделяется 256 блоков размерами 4б, 8б, 256б, 1Кб, 64Кб). Кто желает попробовать и, возможно, усовершенствовать, пишите. Добавлено @ 17:26 Да, забыл добавить. Эта схема дает очень важную возможность для отладки: добавить имя функции и тип данных (присутствует только при #define _DEBUG):
Еще ряд полезных функций:
Т. е. можно следить за состоянием памяти. И, в конец концов, самое, на мой взгляд, полезное: можно сделать так:
Конструктор MemoryStack запоминает текущее состояние: где, какие объекты и сколько. При вызове своего деструктора восстанавливается запомненное состояние. Т. е. автоматическое удаление всего мусора, причем гораздо быстрее вызовов delete. Это удобно при перегруженных new и delete. Присоединённый файл ( Кол-во скачиваний: 10 )
pool.zip 5,83 Kb |
||||||||
|
|||||||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Хотелось бы сравнения с STL Вообще, насчет этого
Оно вроде так и есть... Это сообщение отредактировал(а) sergej.z - 9.12.2005, 17:35 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Согласен,память не отчищается,все что в ней хранилось после ее освобождения так и хроанится,только "ни компьютор ни программа про это не знают" и когда надо затирают. -------------------- Жизнь - печальная штука. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
|
|||
|
||||
| Guest |
|
||||||||
|
Unregistered |
Отож! Я сделал простенький тест: программа 1:
и программа 2:
Разница была раз в 10, если не больше! В пользу программы 2, естественно Засекал я в Windows XP в Task Manager по времени занятости процессора данной программой. На глаз, но очень даже впечатляет Хотя для маленьких объектов разница не столь высока. |
||||||||
|
|||||||||
| Guest |
|
|||
|
Unregistered |
Мне бы тоже Я не настолько дружу с STL. Да и вообще, в программировании я использую WinAPI без MFC и C++ без STL. Подсмотрел я это у программистов из Aldec Inc. - я у них стажировался пару месяцев. Они там от MFC отказались из-за того, что оно очень тормозило их систему (очен мощный копмилятор и симулятор FPGA, CPLD с VHDL, Verilog). Ну а с STL там тоже было весело - в версии от Microsoft оно глючит, поэтому использовали версию от SGI, если не ошибаюсь. Но там тоже были глюки. Поэтому я решил использовать СВОЕ. Ну и потом: насколько я знаю, STL не оптимален по своей природе, т. е. на ассемблере он выглядит громоздко. Впрочем, судить не берусь - код с ним не компилировал, не изучал результат. |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Каждый контейнер STL чательно разрабатывался и дорабатывался.Так что там на 99% наилучший возможный код.Контейнеры STL универсально и за эту универсальность приходится платить,но цена эта 1.Довольно низка 2.В одиночку,торопясь,вряд ли лучше получится. -------------------- Жизнь - печальная штука. |
|||
|
||||
| Neitron |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Согласен. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Причём STL к менеджеру памяти? Разве там память не через new выделяется?
|
|||
|
||||
| A.V.N. |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 22.11.2005 Репутация: нет Всего: нет |
Действительно, вопрос к знатокам: в STL реализован свой алгоритм управления памяти и сборки мусора? Если нет, то никто не мешает переопределить глобально new и delete и, используя STL, там использовать оный менеджер! |
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Управление памятью в STL параметризуется аллокаторами.
Глобальное переопределение new/delete - это плохой тон, можно нарваться на крупные проблемы. Конкретно для использования собственного алгоритма распределения памяти в STL лучше использовать аллокаторы. Посмотрите на Boehm GC, как там это организовано. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| blackofe |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
обнаружив в свое время в stl некое подобие смарт поинтера auto_ptr<>, я, было, обрадовался. но когда оказалось, что его нельзя использовать в тех же stl коллекциях, интерес мой к нему поостыл.
немножко в офф: из велосипедов собственного сочинения некогда сочинил собственный строковый класс. возникла задачка по созданию строк очень большой длины (десятки мегабайт) путем конкатенации маленькими кусочками (в несколько байт). std::string давал очень плохой перформанс. пришлось сочинить свою строку, которая аллокировала память более агрессивно, но зато намного более эффективно. |
|||
|
||||
| A.V.N. |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 22.11.2005 Репутация: нет Всего: нет |
Как я вижу, моя библиотека дает выигрыш по производительности по сравнению с версией от Microsoft Visual C++ 7. Рискну попробовать перегрузить и посмотрю, как оно будет. Я сейчас веду два крупных проекта - две большие программы с активной работой с памятью. Там сразу будут видны хвосты и рога
Я тоже начал с такого же "велосипеда" Продолжаю преобразование своей библиотеки - делаю более универсальной и качественной. Как вижу, библиотека широкую общественность не заинтересовала
Это сообщение отредактировал(а) sergej.z - 12.12.2005, 13:57 |
||||||
|
|||||||
| Mayk |
|
||||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Мои 5 копеек.
Во-первых перед выставлением кода на достояние публики следовало проверить работу на нескольких компиляторах. Два моих гнуса ругались. Комо ругался. Причём они ругались на код в хедере. Гнусы схавали содержимое pool.cpp без единой Во-вторых
при запуске произошел страшный упс - программа вывела на экран две строки. При чём если "hello" была предсказуемой, то "Segmentation fault" было явно не тем, что я ожидал. Я заменил UP<Debugger> deb на UP<Debugger> deb=0; и получил новое сообщение об ошибке в гнусе 3 (четвертый ругался еще страшнее):
Попробовал сделать UP<Debugger> deb(new Debugger); и узнал что
Пробовал скомпилить
и получил
Вместо ожидаемого
Мой моск устал думать в этом направлении. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||||
|
|||||||||||||
| Guest |
|
|||
|
Unregistered |
например, Арт Фридман считает, что самописный аллокатор - идея опасная и, чаще всего, неоправданная.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |