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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Что за WTF с распределением памяти в QVector?  (Прочитано 12343 раз)
vertus
Гость
« Ответ #15 : Февраль 06, 2012, 11:34 »

Всем спасибо, я все понял.

А с QList таких приколов нет? По идее там даже в случае перестановки переназначается указетель на следующий элемент, а сама память не трогается.

QList загадочная вещь и ведет себя в зависимости от размера хранимого объекта. QLinkedList ведет себя так, как тебе нужно. Но все равно хранить прямые указатели на элементы контейнера потенциально опасно

Как вариант свой список реализовать тогда.
Записан
mutineer
Гость
« Ответ #16 : Февраль 06, 2012, 11:36 »

ИМХО лучше архитектуру поменять
Записан
vertus
Гость
« Ответ #17 : Февраль 06, 2012, 11:43 »

ИМХО лучше архитектуру поменять

Тоже вариант, только задача то стандартная.

Есть общее хранилище данных и куча объектов которые содержат некоторые подмножества множества элементов хранилища. Изменять элементы может только хранилище, все остальные могут только их читать.

Соотвественно хранить копии элементов не вариант - нужно синхронизировать данные и памяти потребуется заметно больше.

Qt Implicit Sharing не подходит, уже наелся с ним. Явно нигде не видно что объект передается по ссылке, а вот изменить его запросто где-нибудь можно и забыть потом про это. В итоге опять проблема синхронизации.
« Последнее редактирование: Февраль 06, 2012, 11:45 от vertus » Записан
mutineer
Гость
« Ответ #18 : Февраль 06, 2012, 12:18 »

А хранить в контейнерах не сами объекты, а смарт-поинтеры на них не вариант?
Записан
vertus
Гость
« Ответ #19 : Февраль 06, 2012, 13:20 »

А хранить в контейнерах не сами объекты, а смарт-поинтеры на них не вариант?

В итоге на этом и остановился. Только без смарт поинтеров, а сам выделяю и сам освобождаю. Свой список нагляднее будет просто.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Февраль 06, 2012, 19:29 »

А с QList таких приколов нет? По идее там даже в случае перестановки переназначается указетель на следующий элемент, а сама память не трогается.

Код
C++ (Qt)
QList <int> lst1;      // здесь адреса брать чревато
QList <QRect> lst2; // а здесь можно  
 

Если sizeof(T) <= sizeof(void *) (размер элемента не больше размера адреса) то QList ведет себя как QVector, иначе это просто вектор указателей с удобствами
Записан
KrupaKarlo
Гость
« Ответ #21 : Февраль 07, 2012, 07:42 »

А хранить в контейнерах не сами объекты, а смарт-поинтеры на них не вариант?

В итоге на этом и остановился. Только без смарт поинтеров, а сам выделяю и сам освобождаю. Свой список нагляднее будет просто.

действительно. Зачем ездить на машине, мало ли аккумулятор сдохнет и еще чего. Буду лучше педали крутить.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Февраль 07, 2012, 09:57 »

действительно. Зачем ездить на машине, мало ли аккумулятор сдохнет и еще чего. Буду лучше педали крутить.
Хмм... ну а что такого уж плохого если сам выделяет - сам освобождает? Будет неск строк больше, но никакой катастрофы

Вообще выбор зависит от размера элемента и частоты/порядка обновления. Вектор экономнее но вставка/удаление тяжелее. Если данные создаются один раз но есть многочисленные ссылки на них, то стандартный подход вектор/массив + хранить ссылки как индексы. Указатели удобны но напр сохранение в файл становится сложнее.
Записан
vertus
Гость
« Ответ #23 : Февраль 07, 2012, 10:00 »

Если данные создаются один раз но есть многочисленные ссылки на них, то стандартный подход вектор/массив + хранить ссылки как индексы.

А можно пример? Как хранить ссылки как индексы?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Февраль 07, 2012, 10:48 »

А можно пример? Как хранить ссылки как индексы?
Индекс это просто "номер"

Код
C++ (Qt)
QVector <QPoint3D> mVertex;  // вектор точек
QVector <QVector <int> > mPoly;  // вектор полигонов (хранит индексы)
 
void PrintPoly( int index )
{
const QVector <int> & poly = mPoly[index];  // взяли полигон
printf("poly %d: ", index);
for (int i = 0; i < poly.size(); ++i)  {
 const QPoint3D & pt = mVertex[poly[i]];    // точка полигона
 printf("%.2f, %.2f, %.2f\n", pt.x(), pt.y(), pt.z());
}
}  
 
Ну "вектор векторов" может не самое лучшее, но для начала - нормально
« Последнее редактирование: Февраль 07, 2012, 10:58 от Igors » Записан
vertus
Гость
« Ответ #25 : Февраль 07, 2012, 11:12 »

Че то сразу и не догадался до такого простого решения!

Спасибо!
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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