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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Безопасен ли такой код QList<QPushButton*>?  (Прочитано 21636 раз)
Alex_cs_gsp
Гость
« Ответ #15 : Август 30, 2010, 15:23 »

Будет, но контейнер не копируется, просто применяется константный итератор
С точки зрения C++ контейнер будет копироваться во временный объект

Непонимающий
« Последнее редактирование: Август 30, 2010, 15:27 от Alex_cs_gsp » Записан
BRE
Гость
« Ответ #16 : Август 30, 2010, 15:34 »

Код
C++ (Qt)
template <typename T>
class QForeachContainer {
public:
   inline QForeachContainer(const T& t) : c(t), brk(0), i(c.begin()), e(c.end()) { } // <<<<<< При создании объекта QForeachContainer контейнер копируется
   const T c; // <<<<<< в константный объект c
   int brk;
   typename T::const_iterator i, e;
};
 
#define Q_FOREACH(variable, container)                                \
for (QForeachContainer<__typeof__(container)> _container_(container); \
    !_container_.brk && _container_.i != _container_.e;              \
    __extension__  ({ ++_container_.brk; ++_container_.i; }))                       \
   for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
 
С точки зрения C++ контейнер копируется во временный объект. Но если вспомнить, что все контейнеры Qt реализуют Implicit Sharing, то понимаем, что копировании самих данных контейнера не происходит.
Записан
Alex_cs_gsp
Гость
« Ответ #17 : Август 30, 2010, 15:36 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Август 30, 2010, 15:59 »

Так понятно, константность итератора тут по-сути не причем.
Если бы он не был константным (и было бы "Т с" без const) то данные контейнера бы реально копировались
Записан
Alex_cs_gsp
Гость
« Ответ #19 : Август 30, 2010, 16:32 »

Точно? Потому что Шлее в конце 4 главы приводит пример, в котором он говорит, что копирование происходит только при первой попытки модификации данных.

Код:
QString str1; //refers to the shared_null
QString str2; //refers to the shared_null

str1 = "new string";
str2 = str1; // str1 and str2 refer to the same data

str1 += "add new data"; // is occuring data copy for str1
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Август 30, 2010, 16:58 »

Точно? Потому что Шлее в конце 4 главы приводит пример, в котором он говорит, что копирование происходит только при первой попытки модификации данных.
Копирование "чего". Пусть неконстантный итератор возвращает ссылку на элемент контейнера. Значит вся структура контейнера должна быть "честно" скопирована, выделена память под все элементы (согласно sizeof элемента). При этом сами элементы могут копироваться как "shallow" - если они в стиле Qt и умеют это делать.

Мой (субъективный) совет не увлекаться "модерном" а действовать по классике C/C++, просто и надежно. Напр ну сдался Вам тот foreach? Сэкономили 1-2 строчки а при случае огребли по полной. Qt свои приемчики предлагает но не навязывает, можно писать и так:

Код
C++ (Qt)
size_t i, limit = myList.size();
for (i = 0; i < limit; ++i)
 if (myList[i])..
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #21 : Август 30, 2010, 17:06 »

Сэкономили 1-2 строчки а при случае огребли по полной. Qt свои приемчики предлагает но не навязывает, можно писать и так:

Код
C++ (Qt)
size_t i, limit = myList.size();
for (i = 0; i < limit; ++i)
 if (myList[i])..
 
Не, так точно не стоит. Лучше через Q*Iterator.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Август 30, 2010, 17:10 »

Не, так точно не стоит. Лучше через Q*Iterator.
Да отчего же? Боитесь расходов на оператор []? Они пренебрежимо малы даже по сравнению с shallow  Улыбающийся
Записан
BRE
Гость
« Ответ #23 : Август 30, 2010, 17:14 »

Да отчего же? Боитесь расходов на оператор []? Они пренебрежимо малы даже по сравнению с shallow  Улыбающийся
А как соотносятся итераторы и shallow?
Чем же так опасны итераторы?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Август 30, 2010, 17:27 »

А как соотносятся итераторы и shallow?
Чем же так опасны итераторы?
Ничем не опасны  Улыбающийся Просто цикл for проще, короче и индекс элемента всегда под рукой
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #25 : Август 30, 2010, 17:32 »

for (QList <int>::iterator......
Чем тебе этот for не угодил?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #26 : Август 30, 2010, 17:33 »

Ничем не опасны  Улыбающийся Просто цикл for проще, короче и индекс элемента всегда под рукой
Чем проще? А если индекс элемента не нужен вообще? Для чего инкрементировать/декрименторовать не нужную переменную, да еще постоянно вычислять по ней смещение до нужного элемента? А как быть с индексом при работе со связанным списком (его конечно можно приспособить, только нужно ли?).
Записан
Alex_cs_gsp
Гость
« Ответ #27 : Август 30, 2010, 17:33 »

ИМХО разработчиками не нужно было документировать как вообще происходит распределения  памяти.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #28 : Август 30, 2010, 17:35 »

Кстати, Александреску не рекомендует засовывать в контейнеры ссылки.
Это так, к слову. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #29 : Август 30, 2010, 17:36 »

ИМХО разработчиками не нужно было документировать как вообще происходит распределения  памяти.
Почему?
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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