2016-08-22 2 views
0

Имеет ли функция псевдонима двойное пространство памяти, занимаемое определением функции? Является ли это альтернативным сохранением памяти?r Функция памяти памяти псевдонима

> ss=subset 
> ss(glmC, donchian==don & in_fundo==F & C_V=='C', epsilon2) 
    epsilon2 
1 1e-07 
> ss 
function (x, ...) 
UseMethod("subset") 
<bytecode: 0x0000000018797e70> 
<environment: namespace:base> 

# alternative aliasing 
> ss=function(...) subset(...) 
> ss 
function(...) subset(...) 
> ss(glmC, donchian==don & in_fundo==F & C_V=='C', epsilon2) 
    epsilon2 
1 1e-07 
+0

В первом случае «подмножество» «закрывается» только, на которое ссылаются 'ss' (' .Internal (проверка (ss)) 'и' .Internal (проверка (подмножество)) '), а во втором если вы создадите новое «закрытие» с разными «формалями» и «телом»; то есть другой R_объект_, чем 'подмножество'. –

+0

Я не понял «закрытия». В первом случае это не копия функции, сделанной в памяти (такие же формы и т. Д.)? @alexis_laz – x00

+0

[Ссылка на закрытие] (http://adv-r.had.co.nz/Functional-programming.html#closures). – Gregor

ответ

0

Является ли эта альтернатива заставка сглаживание памяти?

Нет, это не так.

ss = subset 
ss1 = function(...) subset(...) 

object.size(ss) 
# 832 bytes 
object.size(ss1) 
# 1280 bytes 

Мы можем также с помощью pryr::object_size, что может быть более точным.

library(pryr) 
object_size(ss) 
# 832 B 
object_size(ss1) 
# 1.62 kB 

Однако различия настолько малы, что чрезвычайно сложно представить ситуацию, в которой они имеют значение. И, если бы вы были в такой ситуации, связанной с памятью, то, по-видимому, наиболее эффективное решение с точки зрения памяти было бы вовсе не псевдонимом.

+0

tks, @Gregor. Я думал, что в первом случае будет выполнена копия функции, а во втором - только вызов функции. – x00

Смежные вопросы