Russian Qt Forum
Ноябрь 22, 2024, 23:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Хранение "хвостиков"  (Прочитано 24723 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #30 : Сентябрь 22, 2015, 17:01 »

Логика "пользователя Qt": какой класс из букваря похож? Ага, вот этот - ну все, берем  Улыбающийся
Бля, какой же ты упоротый. Для идиота - это класс, которому можно преаллоцировать какое-то количество элементов на стеке (ваш юзкейз "2 флоата"), либо, при превышении этого лимита, он будет аллоцировать необходимое кол-во памяти в куче. Но почитать "букварь" нам же слабо. Мудила.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Сентябрь 22, 2015, 17:22 »

Бля, какой же ты упоротый. Для идиота - это класс, которому можно преаллоцировать какое-то количество элементов на стеке (ваш юзкейз "2 флоата"), либо, при превышении этого лимита, он будет аллоцировать необходимое кол-во памяти в куче. Но почитать "букварь" нам же слабо. Мудила.
А может не надо горячиться и примитивно хамить? Улыбающийся Ведь QVarLengthArray валиден только в текущей области видимости и членом структуры быть не может.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #32 : Сентябрь 22, 2015, 17:50 »

Ведь QVarLengthArray валиден только в текущей области видимости и членом структуры быть не может.
Ну приехали.  Строит глазки
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #33 : Сентябрь 22, 2015, 19:17 »

Ведь QVarLengthArray валиден только в текущей области видимости и членом структуры быть не может.
Может.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Сентябрь 23, 2015, 08:24 »

Ведь QVarLengthArray валиден только в текущей области видимости и членом структуры быть не может.
Тут я конечно фигню спорол, помнил что "выделяет на стеке" - ну и значит что-то типа "alloca" Улыбающийся. На самом деле все опять сводится к этому
Код
C++ (Qt)
template <size_t num>
struct CData {
int mValue;
...
float data[num];
};
QVarLengthArray может хранить др данные (не только float) и добавлять/удалять их - но меня интересует только хранение. В том-то и проблема что воспользоваться такой конструкцией я не могу, т.к. num должно быть известно на компиляции.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Сентябрь 23, 2015, 08:38 »

В том-то и проблема что воспользоваться такой конструкцией я не могу, т.к. num должно быть известно на компиляции.
Этот num в QVarLengthArray определяет границу.
Если данных будет меньше num, то они будут храниться в float data[ num ], а при заполнении этого массива будет алоцирован буфер в куче.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #36 : Сентябрь 23, 2015, 09:25 »

Пример
Код
C++ (Qt)
struct CData {
int mValue;
...
CVarLengthArray <float, ???> data;  // а здесь что?
};
Т.е. привлечение CVarLengthArray ничего не решает, только тратится еще больше памяти на его служебные поля

Вообще какое-то падение скорости можно пережить, в конце-концов есть нагрузка. Но по расходу памяти полный провал - 200Mb vs 1.37Gb  Плачущий
« Последнее редактирование: Сентябрь 23, 2015, 09:28 от Igors » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #37 : Сентябрь 23, 2015, 10:14 »

Расход памяти по сравнению чего с чем?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Сентябрь 23, 2015, 10:16 »

Расход памяти по сравнению чего с чем?
См пост #13
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Сентябрь 23, 2015, 10:21 »

Собственно нужен контейнер (или кастомный аллокатор) который бы не удалял эл-ты, а оставлял "дырки", которые потом могут заполняться. Наверняка в дусте есть такой...
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #40 : Сентябрь 23, 2015, 12:26 »

Цитировать
Наверняка в дусте есть такой...
Наверное, boost::small_vector
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #41 : Сентябрь 23, 2015, 18:36 »

Код
C++ (Qt)
CVarLengthArray <float, ???> data;  // а здесь что?
 

Ну вот допустим я захотел хранить 0, 1, 2, 3, 4 флота напрямую (до 16 байт), а для большего числа эл-тов уже вектор.

А уже далее ничто не мешает сделать
Код:
struct S
{
    size_t size;
    union {
        float data1[4];
        float *data2 {nullptr};
    }
};
« Последнее редактирование: Сентябрь 23, 2015, 18:38 от Авварон » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #42 : Сентябрь 23, 2015, 18:44 »

Но по расходу памяти полный провал - 200Mb vs 1.37Gb  Плачущий
Вы так им пользовалтсь? Улыбающийся
Код
C++ (Qt)
QVarLengthArray<float> data;
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #43 : Сентябрь 23, 2015, 19:05 »

Old
Ну вы что, там же огромный оверхед - там есть int alloc и T* хранится не в юнионе.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #44 : Сентябрь 23, 2015, 19:26 »

Получается, чтобы использовать пул, нужно в структуре хранить адрес свободного элемента (ну или индекс), это как минимум 4 байта для 32 битной системы или 8 байт для 64 битной. Т.е. по размеру эквивалент 1 или 2 флоата. Таким образом, пул для 1-флоатного варианта не имеет смысла на 32 битах. Чтобы уменьшить расход памяти, вариант с 1 флоатом можно тупо паковать в струкуру напрямую. С 2 флоатами - зависит от разрядности. В принципе, я бы тоже паковал в структуру. Для остальных можно делать либо пул, либо вектор.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.214 секунд. Запросов: 23.