Почему рефконт для саба выше, чем для массива? - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть эта тестовая программа:

use strict;
use warnings;
use Devel::Refcount qw( refcount );
my $subref = sub {1};
printf "\$subref has REFCNT=%d\n", refcount( $subref );
my $arrayref = [];
printf "\$arrayref has REFCNT=%d\n", refcount( $arrayref );

Вывод :

$subref has REFCNT=2
$arrayref has REFCNT=1

Почему счетчик ссылок для sub 2 (я ожидал этогобыть 1, как для массива ref)?

1 Ответ

4 голосов
/ 22 сентября 2019

В случае, когда замыкание не используется (т. Е. Подпрограмма не ссылается на какие-либо внешние лексические переменные), Perl оптимизирует вещи, разделяя подпрограмму (CV), а не клонируя ее.Таким образом, первая ссылка относится к подпротоколу «prototype», созданному во время компиляции, с дополнительной ссылкой для каждого $ subref, созданного во время выполнения (RV указывает на исходное резюме).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...