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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Что за WTF с распределением памяти в QVector?  (Прочитано 13527 раз)
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.048 секунд. Запросов: 20.