crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

6 страниц V  < 1 2 3 4 5 > »   
Ответить в данную темуНачать новую тему
> Создание быстродействующего распределителя памяти, для std::vector или замена глобальных операций выделения памяти
BRE
  опции профиля:
сообщение 30.6.2009, 9:28
Сообщение #21


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 30.6.2009, 10:03) *
Есть ини-файл, в котором определено, какие-именно параметры следует выбирать из лог-файлов (бинарные файлы определенного формата, записанные авиа-приборами)! Данные этого ини-файла (описание параметров) считываются в вектор QVector<ParamDescr*>, ParamDescr - абстрактный класс, описывающий вид параметров (в общем виде - название параметра, адрес (в восьмеричной системе счисления), тип параметра). При чтении лог-файлов значения нужных параметров (сравниваются получаемые адреса) записываются по нужному индексу в вектор значений параметров (как раз в params)! Что именно делать с QList, как и что складывать я не совсем понял. Можешь пояснить, пожалуйста? Если что-то в коде запишешь, буду благодарен.

Так может удобней будет использовать QMap. INI-файл читается в QMap<адрес, ParamDescr*>, а дальше при чтении логов из мапа находиться необходимый параметр и устанавливаются его значение?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.6.2009, 9:31
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 30.6.2009, 10:28) *
Так может удобней будет использовать QMap. INI-файл читается в QMap<адрес, ParamDescr*>, а дальше при чтении логов из мапа находиться необходимый параметр и устанавливаются его значение?

Нельзя, уже реализовано. Перетряхивать всю программу - нерентабельно. Задача - ускорить при загрузке. Далее - будет ускорить при отрисовке- но это уже другой вопрос.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 30.6.2009, 10:28
Сообщение #23


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(AD @ 30.6.2009, 12:23) *
Цитата(Tonal)
В stl у std::vector есть параметр шаблона, который позволяет указать свой менеджер памяти для этого вектора - это именно то, что тебе нужно.

Раньше не писал собственных аллокаторов памяти. Поможешь если что? С чего написание аллокатора памяти начать писать? Заранее спасибо!

Ничего писать не нужно. :)
Смотри здесь, в самом конеце страницы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.6.2009, 10:41
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 30.6.2009, 11:28) *
Ничего писать не нужно. :)
Смотри здесь, в самом конце страницы.

А мне какой allocator использовать? Буста в проекте нет! Ну как я понял, хватит какого-то стандартного. Какой необходим? Прости, если глупый вопрос, возможно, чего-то не понимаю!

Сообщение отредактировал AD - 30.6.2009, 10:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 30.6.2009, 10:54
Сообщение #25


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Можешь написать свой, проще зацепить из буста. :)
Где-то я встречал библиотечку шаблонов для лёгкого написания аллокаторов stl - думал в бусте, сейчас не вспомню...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.6.2009, 11:11
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 30.6.2009, 11:54) *
Можешь написать свой, проще зацепить из буста. :)
Где-то я встречал библиотечку шаблонов для лёгкого написания аллокаторов stl - думал в бусте, сейчас не вспомню...

Думаю, тогда может попробовать написать свой! :) Если что, поможете? Надо научиться их писать! Заодно увидеть, как это все устроено. А то одной теории из Саттера, маловато будет!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.6.2009, 12:09
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


да, кстати, а мне нужно наследоваться от стандартного аллокатора? Или полностью "свои велосипеды" писать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.6.2009, 14:09
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Странно, как-то не очень помогло. Или я что-то забыл?
allocator
#ifndef SPECIFIC_ALLOCATOR_INL
#define SPECIFIC_ALLOCATOR_INL

#include <memory>
#include <cassert>

/// Собственный распределитель памяти
template <typename T> void allocator_construct(T* p, const T& t) { new(p) T(t); }
template <typename T> void allocator_destroy(T* p) { p -> ~T(); }

template <typename T, typename A>
struct rebind_allocator
{
    typedef typename A::template rebind<T> binder;
    typedef typename binder::other type;
};

template <typename T>
class spec_allocator
{
public:
   typedef T                value_type;
   typedef value_type*        pointer;
   typedef const T*            const_pointer;
   typedef T&                reference;
   typedef const T&            const_reference;
   typedef std::size_t        size_type;
   typedef std::ptrdiff_t    difference_type;

   template <typename Other>
   struct rebind
   { typedef spec_allocator<Other> other; };

   spec_allocator() {}
   template <typename Other> spec_allocator(const spec_allocator<Other>&) {}
   spec_allocator(const spec_allocator&) {}
   template <typename Other> spec_allocator& operator=(const spec_allocator<Other>&) { return *this; }
   ~spec_allocator() {}
   pointer address(reference x) { return &x; }
   const_pointer address(const_reference x) const { return &x; }
   pointer allocate(size_type n, const void* = 0)
   { return (n != 0) ? reinterpret_cast<pointer>(::operator new(n * sizeof(value_type))) : 0; }
   void deallocate(pointer p, size_type n)
   {
       assert((p == 0) == (n == 0));
       ::operator delete((void*)p);
   }
   size_type max_size() const { return size_t(-1) / sizeof(value_type); }
   void construct(pointer p, const T& val) const { allocator_construct(p, val); }
   void destroy(pointer p) const { allocator_destroy(p); }
};

#endif // SPECIFIC_ALLOCATOR_INL


Вот как использую
/// Структура для хранения всех значений параметров в логе
struct LOGRECORD
{
public:
    //PARAMVALUE* params;                    ///< массив параметров
    std::vector<PARAMVALUE, spec_allocator<PARAMVALUE> > params;    ///< вектор параметров
/// ....
};

В чем еще могут быть проблемы? Что-то еще следует дописать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 30.6.2009, 14:49
Сообщение #29


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Хм, есть опасение, что если причиной разработки аллокатора стали проблемы с быстродействием программы (т.е. это попытка улучшить быстродействие), то вряд ли чего получится. Хотя, конечно, "нет процессора, кроме процессора, и Профайлер - пророк его" :)
Причина мне представляется в том, что в многопоточных версиях CRT (по крайней мере, под Win) глобальные операторы ::new и ::delete защищены критической секцией - и операции выделения памяти по ::new и удаления по ::delete ну очень! "дорогие" по времени.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 30.6.2009, 14:56
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 30.6.2009, 15:09) *
В чем еще могут быть проблемы? Что-то еще следует дописать?

Попробуй сделать свой аллокатор наследником std::allocator.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V  < 1 2 3 4 5 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 17:54