Так что, пытаясь исправить ошибку в последнее время, парень-хакер сказал мне, что поскольку значение строки, переданной подпрограмме (методу), может быть довольно большой, доступ к ней через $_[1]
позволит избежать копирования памяти. Однако, я думал, что любое значение, переданное подпрограмме, было скопировано в @_
? поэтому в приведенном ниже примере память копируется дважды? или я ошибаюсь в отношении копии, сделанной при передаче методу?Имеет ли доступ к @_ непосредственно к копии памяти большого скаляра?
sub foo {
my $self = shift
$_[0] # access $str in @_ directly
my ($str) = @_; # makes another copy of @_
}
sub bar {
my $self = shift;
my $str = 'something very large';
$self->foo($str); #copies $str to the @_ of foo
}
Вот почему я предложил автору, позволяющей пройти мимо скалярной реф, который позволит избежать копии (кроме самой ссылки) при переходе к самому методу. Повторить: передает ли значение подпрограмме среднее значение копируется в @_
?
Одна вещь, которую следует помнить: «Преждевременная оптимизация - это корень всего зла». –
@eugeney спасибо, но понимание того, как все работает, не – xenoterracide
@eugeney Итак, мы можем создать специальный путь в 'sqrt (evil)', который немедленно возвращает «Преждевременная оптимизация», правильно? –