В программе, которую я пишу, мне приходится передавать большие структуры данных (изображения) между функциями. Мне нужно, чтобы мой код работал как можно быстрее на разных ОС (таким образом, я не могу профилировать все тестовые случаи). У меня часто есть код формы...
void foo() {
ImageType img = getCustomImage();
}
ImageType getCustomImage() {
ImageType custom_img;
//lots of code
return custom_img;
}
Насколько мне известно, строка ImageType img = getCustomImage();
приведет к вызову конструктора копирования для img
с возвращаемым значением из custom_img
в качестве параметра. Википедия говорит, что некоторые компиляторы даже проделывают эту операцию снова, для исходной временной переменной!
Мой вопрос: быстрее ли вообще обходить эти накладные расходы (конструкторы копирования для изображений дороги), используя передачу по ссылке, а не возвращаемое значение...
void foo() {
ImageType img;
getCustomImage(img);
}
void getCustomImage(ImageType &img) {
//code operating directly on img
}
Мне сказали, что если компилятор поддерживает оптимизацию возвращаемого значения, то разницы быть не должно. Это правда? могу ли я (в пределах разумного) допустить это в наши дни, и как мне структурировать свои программы, когда важна скорость
getCustomImage
это применимо только к C++. - person Vicky   schedule 03.11.2011ImageType
, даже без оптимизации возвращаемого значения, эти две формы могут быть более или менее эквивалентны. Вот почему единственный правильный ответ на вопрос, что быстрее, — профиль. Если вы не можете работать со всеми платформами, выберите свою любимую... основные проблемы, скорее всего, будут универсальными. - person Dennis Zickefoose   schedule 03.11.2011ImageType
. Если бы этот класс стал небольшим, легким обработчиком для динамически управляемого хранилища (скажем, членомvector
), и если вы используете семантику перемещения C++11, то вы могли бы оставить свой код как есть (возврат по значению) и вы получите хорошую производительность. - person Kerrek SB   schedule 03.11.2011