Почему «если объект имеет две привязки, а одна исчезает, счетчик ссылок не возвращается go к 1»? - PullRequest
2 голосов
/ 07 апреля 2020

Advanced R 2019 говорит о копировании при модификации для объектов. Затем некоторые исключения (изменение на месте):

Если объект имеет одно имя, связанное с ним, R изменит его на месте.

Из-за двух сложностей предсказание точно, когда R применяет эту оптимизацию, усложняется:

  • Когда дело касается привязок, R в настоящее время может считать только 0, 1 или много . Это означает, что , если объект имеет две привязки, и одна исчезает, счетчик ссылок не возвращается go к единице: одна меньше, чем многие, все еще много . В свою очередь это означает, что R будет делать копии, когда ему иногда не нужно .

  • ...

Являются ли следующие два предложения противоречащими друг другу?

  • "R в настоящее время может считать только 0, 1 или много".

  • "если объект имеет две привязки и одна исчезает, счетчик ссылок не go возвращается к 1: одна меньше, чем много, все еще много", и "R сделает копирует, когда это иногда не нужно ".

Спасибо.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Я не уверен, что это утверждение остается верным. Давайте взглянем на .Internal(inspect()).

. Рассмотрим следующее:

x <- 1L
x[[1]] <- 2L
x
#[1] 2

Если мы используем .Internal(inspect(x)):

.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(1)] (len=1, tl=0) 2

Мы видим на основе [NAM(1)] что существует только один символ, относящийся к адресу 7fa684891478.

Теперь давайте присвоим x y.

y <- x
.Internal(inspect(y))
#@7fa684891478 13 INTSXP g0c1 [NAM(2)] (len=1, tl=0) 2
.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(2)] (len=1, tl=0) 2

Мы видим, что y и x совместно используют один и тот же адрес памяти, а [NAM()] равно 2.

Теперь давайте назначим x на z.

z <- x
.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(3)] (len=1, tl=0) 2

Независимо от того, даже если мы удалим символы указывая на 7fa684891478, [NAM()] никогда не увеличивается.

rm(z)
.Internal(inspect(x))
#@7fa684891478 13 INTSXP g0c1 [NAM(3)] (len=1, tl=0) 2
R.Version()
#...
#$version.string
#[1] "R version 3.6.3 (2020-02-29)"
0 голосов
/ 07 апреля 2020

Учитывая, что "R в настоящее время может считать только 0, 1 или много", "если объект имеет две привязки, и одна исчезает", почему "счетчик ссылок не go возвращается к 1: один меньше, чем много, все еще много. Больше").

и «R будет делать копии, когда это иногда не нужно»?

Если бы было разрешено больше значений или R использовал бы правильный подсчет ссылок, такие копии могли бы не требуется.

Следовательно, подсчет ссылок означает, что go выше 1 (что поможет уменьшить объем копирования), вероятно, когда-нибудь будет реализовано. https://developer.r-project.org/Refcnt.html

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