Страницы

Поиск по вопросам

пятница, 21 июня 2019 г.

Возврат из функции

Можно ли возвращать ссылку на локальную переменную? Будет ли это быстрее, чем возврат по значению?
int const& func(...) { int x; ... return x; }


Ответ

Нет, возвращать ссылку на локальную переменную нельзя (т.е. компилятор допускает, но категорически не стоит так делать), так как в результате таких действий вы получите ссылку на область памяти, выделенную под локальную перемменную из функции, которая вышла из области видимости за её пределами. Вследствие чего, эта область памяти будет помечена, как свободная (заметьте, что она будет лишь помечена свободной, а не перезаписана 0-ми или чем-нибудь еще, что в общем случае зависит от конкретного компилятора), а в дальнейшем может в любой момент быть перезаписана кем-угодно (например, при выделении памяти под какую-нибудь другую переменную).
Контрольный пример:
#include
int const& func() { int x = 1; return x; }
int main() { const int& x = func(); std::cout << x << std::endl; // немаловероятно, что уже здесь область памяти будет перезаписана и результат будет "неожиданным" std::cout << x << std::endl; // нет уверенности даже в том, что в данной строчке будет выведно тоже значение, что и в предыдущей }
Можете посмотреть здесь на примере компилятора gcc

В тоже время, если воспользоваться локальной static переменной из функции (синглтон Майерса), то такое действие будет валидно, так как такая переменная будет "жить" все время "жизни" приложения. Вследствие чего, область памяти, выделенная под нее (на которую мы будем ссылаться), не будет помечена свободной все время "жизни" приложения (не следует так делать - это чисто для примера):
#include
int const& func() { static int x = 1; return x; }
int main() { const int& x = func(); std::cout << x << std::endl; // 1 }

Комментариев нет:

Отправить комментарий