C ++ возврат по ссылке несколько раз - PullRequest
2 голосов
/ 18 января 2012

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

У меня есть функция-член доступа, которая выглядит следующим образом:

    std::string const& access_element(int index) const;

Если у меня есть другая функция-член, которая вызывает access_element (), нужно ли мне также возвращать ее по ссылке?

Например.

    float const& access_element2(int index) const {
       return atof(access_element(index));
    }

против

    float access_element2(int index) {
       return atof(access_element(index));
    }

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Вот хорошая статья: Хотите скорость? Передать по значению.

Также вам действительно нужно быть осторожным с возвратом по ссылке. Ссылки похожи на указатели в том, что вы можете получить висячие ссылки, которые юридически непригодны для использования. Следующее имеет неопределенное поведение:

int const &foo() {
    return 1;
}

Кроме того, при передаче примитивных типов, таких как float, обычно лучше просто скопировать их, поскольку передача указателя означает, что вместо этого вы будете копировать указатель, что вряд ли будет быстрее копирования самого значения. Этот ответ имеет хорошее эмпирическое правило для определения параметров по отношению к значению: https://stackoverflow.com/a/1567186/365496

Еще одна причина для передачи по const & вместо значения заключается в том, что для создания копии может потребоваться выделение памяти в куче. Такие копии могут потерпеть неудачу, и поэтому лучше передавать по ссылке, чтобы избежать этой ошибки.

3 голосов
/ 18 января 2012

Вы возвращаете по ссылке временное значение.В этом случае ваше узкое место не в том, чтобы вернуть копию.atof возвращает временное значение.Если вы хотите ускорить возврат по ссылке, вы должны вернуть объект-член или объект-член объекта-члена (например, векторного элемента), который возвращается по ссылке.

float const& access_element2(int index) const {
   return elements[index];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...