Данные копирования, как представляется, произойдет
sub maketext {
my $text = 'text';
say \$text;
return $text;
}
my $bar_ref = \maketext();
say $bar_ref;
Печатается
SCALAR(0x11f5818)
SCALAR(0x11cfa68)
Адреса данных, созданных в суб и что $bar_ref
указывает не то же самое.
На лицевой стороне, так как функция возвращает данные, необходимо скопировать их, а также ссылку на это.
Другая возможность заключается в том, что ссылка на исходные данные сохраняется даже по мере того, как она выходит за пределы области видимости, как это происходит при закрытии. Однако здесь функция возвращает сначала, а затем ее управление обрабатывается. Поэтому я не вижу, как какой-либо механизм будет знать, что делается с данными, поэтому данные должным образом скопированы.
Вы создаете анонимную скалярную ссылку, но не возвращаете функцию.
способ создать ссылку на скаляр, не имея соответствующей переменной вокруг
my $scalar_ref = \do { my $var };
или do { \my $var }
, или в вашем случае с суб
sub anon_scalar_ref {
# ...
return \my $var;
}
Однако, Я не понимаю, что вы будете использовать. Может быть, вы хотите сделать
sub maketext {
# ... define $text ...
return \$text;
}
При назначении возвращения этого к переменной никакие дополнительные копии данных не производятся, так как это ссылка, которая возвращается.
Даже думать о том, сколько времени провел здесь огромная ошибка. Вы должны подумать, какой код более читабельен. И в том случае, когда ваш результат настолько огромен, что копирование действительно влияет на вас, вы должны вернуть ссылку. –
«Преждевременная оптимизация - это корень всего зла». Даже не думайте об этом, это тривиально. За исключением случаев, когда это не так, но для этого вы используете профилировщик кода. – Sobrique
Это не обязательно микро-оптимизация. Я не знаю ответа, и мне любопытно узнать, что это такое, только потому, что. – simbabque