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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Теоретический вопрос по ссылкам на QFileInfoList  (Прочитано 2822 раз)
Silver_swift
Гость
« : Октябрь 29, 2012, 09:29 »

Доброго времени суток, колеги!
По ходу напсиания кода возник вопрос:

Изначально была функция в которой объявлялся QFileInfoList, заполнялся и с его элементами выполнялись некие действия:
void func(){
QFileInfoList lst;
....
//заполнение, чтение из него.
}


Затем заполнение QFileInfoList стало слишком громоздким и было выделено в отдельный метод.

QFileInfoList fillList(){
QFileInfoList lst;
....
//заполнение
return lst;
}

void func(){
QFileInfoList lst = fillList();
....
//работа со списком
}

При этом, насколько я понимаю, вызывается конструктор-копировщик и после вызова функции fillList() в стеке создается новый список в который заносятся копии элементов. То есть если список будет большой, то это займет много времени.
Видимо правильнее было бы создать список в динамической памяти и возвращать указатель на него. Но это вроде как старый сишный стиль и этого лучше избегать.
Сразу приходит в голову мысль об использовании ссылок, например, вот так:

QFileInfoList fillList(){
QFileInfoList & lst = *(new QFileInfoList());
....
//заполнение
return lst;
}

void func(){
QFileInfoList lst = fillList();
....
//работа со списком
}

Но тут у меня возникают вопросы:
1. Не говнокод ли это с кучей потенциальных проблем?Улыбающийся
2. Что при этом происходит? То есть содается ли только один список файлов в динамической памяти, который затем везде используется или все равно происходит копирование элементов в стек на каком-то этапе?

P.S. Вопрос для общего развития. Просто хочется научиться писать правильный код. Улыбающийся Спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 29, 2012, 10:54 »

Просто и хорошо передавать структуры по значению или ссылке, напр
Код
C++ (Qt)
void FillList( QFileInfoList & lst );
void FillList( QFileInfoList * lst );
 
Это "по классике", то есть всегда правильно. Плюс написав так Вы можете быть уверены что оптимальнее варианта нет.

Можно также полагаться на оптимизацию компилятора
Код
C++ (Qt)
QFileInfoList lst = FillList();
 
Хотя никто этого официально не заявляет, здесь будет 1 вызов конструктора а не 2. Однако тут надо осторожнее, напр
Код
C++ (Qt)
QFileInfoList lst;
lst = FillList();
 
Вот здесь уже "минимум неясно" - скорее всего паразитное копирование состоится. Поэтому следует признать говнокодом

В Qt модно подавать и возвращать контейнеры по значению, полагаясь на implicit sharing. Я лично ничего хорошего в этом не вижу, это не выигрывает ни в краткости, ни в выразительности. А заморочек заметно больше - понадобился напр контейнер std - и приплыли
Записан
twp
Гость
« Ответ #2 : Октябрь 31, 2012, 14:03 »

для начала
Цитата: Assistant
typedef QFileInfoList
Synonym for QList<QFileInfo>.
и теперь читаем в ассистенте про Implicit Sharing.
А если коротко - то никаких ссылок, указателей и прочих заморочек не нужно - работает счетчик ссылок
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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