写入时复制参考

时间:2018-06-13 06:46:24

标签: perl

Perl目前支持标量变量Copy on Write (CoW),但它似乎没有任何hashrefs和arrayrefs。

但是,Perl确实有子程序来修改weaken之类的变量内部,所以我猜测可能存在解决方案。

我有一种情况,我有一个大的结构,我从一个包中返回,保持这个大结构的内部状态。我想确保如果修改了返回的引用或内部引用(它们都是当前相同的引用),我最终会遇到写入时复制的情况,其中引用所指向的数据被复制,修改和用于修改数据的引用被更新为指向新数据。

package SomePackage;
use Moose;

has some_large_internal_variable_ref => (
    'is'  => 'rw',
    'isa' => 'HashRef',
);

sub some_operation {
    my ($self) = @_;
    $self->some_large_internal_variable_ref({
        # create some large result that is different every time
    });
}

sub get_result {
    my ($self) = @_;
    return $self->some_large_internal_variable_ref;
}

1;

use strict;
use warnings;
use SomePackage;
use Test::More;

# Situtation 1 where the internally stored reference is modified
# This will pass!

my $package = SomePackage->new();
$package->some_operation();
my $result1 = $package->get_result();

$package->some_operation();
my $result2 = $package->get_result();

isnt($result1, $result2, "These two references should no longer be the same");


# Situtation 2 where the externally stored references is modified
# This will fail

$package = SomePackage->new();
$package->some_operation();
$result1 = $package->get_result();
$result1->{foo} = "bar";

$result2 = $package->get_result();

isnt($result1, $result2, "These two references should no longer be the same");

done_testing;

我正在尝试避免我必须克隆get_result返回值的情况,因为这会导致内存使用率翻倍的情况。

我希望有某种形式的weaken我可以调用该变量来指示,如果修改是为了使用Copy on Write行为进行操作。

0 个答案:

没有答案