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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] константная ссылка в foreach  (Прочитано 8605 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Январь 22, 2016, 10:42 »

К слову из-за того, что реализация QList implicit shared, таким кодом вы корректируете все взаимосвязанные с данным списком данные.
Почему?
Код
C++ (Qt)
QVector <int> vec;
vec << 1 << 2 << 3;
QVector second = vec;  // пока vec и second шарят одну копию данных
int & a = const_cast<int &> (vec[0]);
 
Да, const_cast, но ведь все равно выполняется оператор [], он возвращает неконстантную ссылку, значит расшарит данные

Edit: A! Так foreach использует константный итератор - тогда да, никакого расшаривания не будет. Так это ж hidden feature!  Улыбающийся
« Последнее редактирование: Январь 22, 2016, 10:52 от Igors » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #16 : Январь 22, 2016, 11:11 »

Вот это штука "implicit shared" сильно на производительности сказывается или как? Можно ее отключить?
А что у нас есть вместо QVector/Qlist... только std::vector?

Как перед foreach расшарить данные, чтобы были в единственном экземпляре?
Сделали бы в Qt не константный foreach который бы и расшаривал.
« Последнее редактирование: Январь 22, 2016, 11:14 от deMax » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Январь 22, 2016, 11:27 »

Вот это штука "implicit shared" сильно на производительности сказывается или как? Можно ее отключить?
А что у нас есть вместо QVector/Qlist... только std::vector?

Как перед foreach расшарить данные, чтобы были в единственном экземпляре?
Сделали бы в Qt не константный foreach который бы и расшаривал.
Любой вызов неконстантного метода (напр ls[0]) вызовет расшаривание. По поводу форыча
Код
C++ (Qt)
for (int i = 0; i < lst.size(); ++i) {
 int & a = lst[i];
 ...
}
Чего не хватат? Чего неймется, к чему поиск "более элегантных" решений, обычный рез-т которых = 1 строка вместо 2, зато капитально заморочить яйца читающему код? Ей-богу, фигней занимаетесь  Плачущий
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #18 : Январь 22, 2016, 12:04 »

Если вы используете такой вариант

Код
C++ (Qt)
void ( const QList< int > & values )
{
   ...
   foreach ( const int & value, values )
   {
       const_cast< int & >( value ) = 1;
   }
   ...
}
 

то values не вызывает проверку того, что он shared. Данные будут изменены в обобщенном списке.

Для выполнения detach() необходимо вызвать любой не константный метод values.

И ... "implicit shared" сильно на производительности сказывается, так как не выполняются лишние копирования данных списка.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #19 : Январь 22, 2016, 12:49 »

>>Чего не хватат? Чего неймется
у Вас lst 2 раза используется, если это будет функция класса(peoples.getMen(Vasia Pupkin).getHand.getFingers()) получим копипаст или дополнительную строчку
Да я только что узнал про эту "великую фичу"(думал такая ерунда только в QSharedPointer), сижу в шоке - мне она как собаке пятое колесо Грустный
Вещь в принципе неплохая, и на производительности современных ПК не скажется, скорее даже лучше станет - т.к. код можно писать более грязно(в стиле си шарпа).

p.s. всем спасибо, буду переходить на C++11.
« Последнее редактирование: Январь 22, 2016, 12:52 от deMax » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #20 : Январь 22, 2016, 14:02 »

>>Чего не хватат? Чего неймется
у Вас lst 2 раза используется, если это будет функция класса(peoples.getMen(Vasia Pupkin).getHand.getFingers()) получим копипаст или дополнительную строчку
Да я только что узнал про эту "великую фичу"(думал такая ерунда только в QSharedPointer), сижу в шоке - мне она как собаке пятое колесо Грустный
Вещь в принципе неплохая, и на производительности современных ПК не скажется, скорее даже лучше станет - т.к. код можно писать более грязно(в стиле си шарпа).
Хотя частичная вина этой штуки тоже есть, что Qt такой тормознутый и жирный.

p.s. всем спасибо, буду переходить на C++11.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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