Вы можете вернуть по значению, поскольку ненужные копии будут оптимизированы.
Это четкий, исключительный и рекомендуемый способ.
void ThreadWorker::run()
{
QStringList file_list = collect_file_paths();
}
QStringList ThreadWorker::collect_file_paths()
{
DirectorySearch ds;
return ds.get_file_names(strPath_); // you should not use leading underscore in c++
}
QStringList DirectorySearch::get_file_names(QString path)
{
QStringList file_names;
traverse(path, &file_names);
return file_names;
}
http://cpp -next.com / Архив / 2009/08 / хотите-скорость-передача по значению /
Btw. Я думаю, что у Qt Containers есть копия при оптимизации записи, поэтому копия будет дешевой даже без оптимизации компилятора.
Если вы не доверяете (очень распространенной) оптимизации компилятора, такой как RVO (комментарий heishe), и не используете объекты копирования при записи, такие как QStringList, вы должны создать экземпляр в методе run () и передать ссылка на другие функции. Это не так ясно, как моя рекомендованная методика, но все равно безопасно для исключений (по крайней мере, основная гарантия).
void ThreadWorker::run()
{
QStringList file_list;
collect_file_paths(file_list);
}
void ThreadWorker::collect_file_paths(QStringList& file_list)
{
DirectorySearch ds;
ds.get_file_names(strPath_, file_list);
}
void DirectorySearch::get_file_names(QString path, QStringList& file_list)
{
traverse(path, &file_list);
}
Третье решение - вернуть интеллектуальный указатель, такой как std::unique_ptr<QStringList>
. Но я не вижу никакой причины для дополнительного динамического выделения в этом примере.