Название: Теоретический вопрос по ссылкам на 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 Просто и хорошо передавать структуры по значению или ссылке, напр
Код Это "по классике", то есть всегда правильно. Плюс написав так Вы можете быть уверены что оптимальнее варианта нет. Можно также полагаться на оптимизацию компилятора Код Хотя никто этого официально не заявляет, здесь будет 1 вызов конструктора а не 2. Однако тут надо осторожнее, напр Код Вот здесь уже "минимум неясно" - скорее всего паразитное копирование состоится. Поэтому следует признать говнокодом В Qt модно подавать и возвращать контейнеры по значению, полагаясь на implicit sharing. Я лично ничего хорошего в этом не вижу, это не выигрывает ни в краткости, ни в выразительности. А заморочек заметно больше - понадобился напр контейнер std - и приплыли Название: Re: Теоретический вопрос по ссылкам на QFileInfoList Отправлено: twp от Октябрь 31, 2012, 14:03 для начала
Цитата: Assistant typedef QFileInfoList и теперь читаем в ассистенте про Implicit Sharing.Synonym for QList<QFileInfo>. А если коротко - то никаких ссылок, указателей и прочих заморочек не нужно - работает счетчик ссылок |