Передать вывод функции прямо в функцию, которая принимает опорные параметры? - PullRequest
4 голосов
/ 19 августа 2011

Это мой первый пост, и я надеюсь, что я делаю это хорошо. Я пытался решить эту проблему некоторое время, но в то же время просто обратился к промежуточной переменной. Ну, это то, что я имею в виду:

//from a pre-built library
double getValue(int idx)
{ 
  //Returns some value from within a class 
}

//from a function I created
void setValue(double &input)
{
  //set some value here
}

В настоящее время я выполняю свою программу следующим образом:

double numberOne;
numberOne = getValue(0);
setValue(numberOne);

Это работает и компилируется. Однако я хотел бы сделать что-то следующее:

setValue(getValue(0));

Однако, похоже, я не могу понять это правильно (пробовал несколько ссылок / разыменований, но я просто стреляю в темноте). Я хотел бы знать, возможно ли это сделать? Кроме того, если это возможно, есть ли какие-либо преимущества в скорости / объеме памяти для выполнения этого способа, вместо того, чтобы иметь промежуточное значение хранилища (также называемое numberOne). Это действительно не относится к значению типа double, но когда это класс с гораздо большей занимаемой площадью, я бы хотел максимально сократить объем используемой памяти \ глубокого копирования из соображений скорости \ памяти.

В дополнение к этому есть какие-либо книги или онлайн-ресурсы, которые могут помочь мне ускорить мои программы на C ++ с другими улучшениями эффективности для ускорения \ использования памяти.

Заранее большое спасибо за любую помощь, которую вы можете оказать.

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Измените это:

void setValue(double &input)

на

void setValue(double input) 

В конце концов, input действительно должен быть введен, и поэтому setValue() должен воспринимать это так.Здесь производительность не даже хуже, если вы передадите по значению.Однако для больших классов вы можете изменить его на ссылку , избегать копирования и добиться лучшей производительности:

void setValue(const VeryBigClass & input) 
2 голосов
/ 19 августа 2011

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

Вы можете привязать временную ссылку к константной ссылке, например,

SetValue(const double& value);

Это может быть полезно для больших или более сложных типов, но для примитивных типов, таких как double, вы можете также передать его по значению

SetValue(double value);
0 голосов
/ 19 августа 2011

Вы преобразуете свое значение:

void setValue(const double &input)
{
  //set some value here
}

Это должно устранить проблему.

Если ваш «двойник» достаточно велик (здесь он бесполезен), есть преимущество в получении ссылки. Таким образом, вы скопируете только ту часть объекта, которая вас интересует, в setvalue().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...