因此,最近在尝试修补错误时,一位黑客同事告诉我,由于传递给子例程(方法)的字符串的值可能非常大,因此通过访问它$_[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
}
这就是为什么我向作者建议允许通过标量 ref 传递,这将在传递给方法本身时避免复制(除了引用本身)。重申一下:将值传递给子例程是否意味着该值被复制到@_
?