Эффективность.Возвращаемые значения функции в зависимости от выходных параметров - PullRequest
2 голосов
/ 13 октября 2010

Функция возвращает значения в зависимости от параметра «выход», какой из них быстрее? Я думаю, что лучше объяснить, используя то, над чем я сейчас работаю.

// specify identifier and return pointer.
SceneNode* createSceneNode(const String& desired_identifier);   // f1

// auto-gen identifier and return as string.
String createSceneNode(SceneNode*& out_ptr_to_creation); // f2

// auto-gen identifier and return pointer to node
SceneNode* createSceneNode(String& out_gen_identifier); // f3

// auto-gen identifier and return as string.
void createSceneNode(SceneNode*& out_ptr_to_creation, String& out_gen_identifier); // f4

Хотя я предпочитаю f1 и f3, потому что они возвращают SceneNode *, они приводят к вызову ambiguos. Кроме того, часто требуется только SceneNode *. String & в f3 будет представлять некоторые неудобства и накладные расходы, поэтому я планирую f1 и f2.

Мой вопрос, будет ли разница между

f2(node); // return value not assigned.
          // will there be an optimisation NOT to copy string?
mystring = f2(node);

Я предполагаю, что хранилище параметров функции должно находиться в некоторой области очень быстрого доступа и будет легко доступно, чтобы выходные параметры работали быстрее. однако, если оптимизация выполнена для предотвращения копирования строки в f2, то f2 будет лучше, чем f4.

Я знаю, что в моем примере это может быть минимальным, но я просто хочу знать, ради интереса.

еще один побочный вопрос: я всегда предполагаю, что ссылки - это 32-битные данные, а проходная ссылка - так же быстро, как указатели, не так ли?

Спасибо. =)

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

разница между

mystring = f2(node)

и

f2(node)

важно понимать. В первом случае большинство компиляторов оптимизируют конструктор копирования для возврата по значению и просто назначают строку из функции без дополнительного шага копирования. В случае второй версии большинство оптимизаторов полностью покончат с любой копией или присваиванием (присваивания нет вообще, и конструктор копирования для возврата можно оптимизировать).

Ваше утверждение о f2 против f4 является точным. Из-за оптимизации возврата у f2 есть хорошие шансы опередить f4. (Я добавлю ссылку на хорошую статью, когда найду ее.)

Да, и передача указателей по ссылке - это нормально.

1 голос
/ 13 октября 2010

Я бы использовал f1 и f3 и просто изменил бы имя одной из функций (например, f1 => createSceneNodeWithId).Семантика обеих функций достаточно различна, чтобы гарантировать разные имена.Я бы избегал ссылки на указатель (SceneNode *&), поскольку это может немного сбивать с толку.

Возвращение String может быть медленным, поэтому да, вам лучше избегать его и использоватьвыходной параметр.Я не думаю, что копирование может быть оптимизировано, если (а) функция не встроена или (б) ваш компилятор не выполняет хороший анализ всей программы.Компилятор Intel C ++ делает это, но я не знаю, поймет ли он этот случай.

В ответ на ваш дополнительный вопрос: ссылка - это действительно указатель с другим синтаксисом.Он будет иметь 32-битную ширину на 32-битной платформе и 64-битную на 64-битной платформе.

...