Russian Qt Forum

Qt => Общие вопросы => Тема начата: Silver_swift от Октябрь 29, 2012, 09:29



Название: Теоретический вопрос по ссылкам на QFileInfoList
Отправлено: 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. Вопрос для общего развития. Просто хочется научиться писать правильный код. :) Спасибо.


Название: Re: Теоретический вопрос по ссылкам на QFileInfoList
Отправлено: Igors от Октябрь 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 - и приплыли


Название: Re: Теоретический вопрос по ссылкам на QFileInfoList
Отправлено: twp от Октябрь 31, 2012, 14:03
для начала
Цитата: Assistant
typedef QFileInfoList
Synonym for QList<QFileInfo>.
и теперь читаем в ассистенте про Implicit Sharing.
А если коротко - то никаких ссылок, указателей и прочих заморочек не нужно - работает счетчик ссылок