[Rcpp-devel] Call by reference

Nathan Kurz nate at verse.com
Wed Jul 29 22:05:21 CEST 2015

On Wed, Jul 29, 2015 at 10:37 AM, Dirk Eddelbuettel <edd at debian.org> wrote:
> You misunderstand.  We communicate by SEXP.  Where the P stands for pointer.
> IE even with
>   R> M <- as.data.frame(matrix(rnorm(1e6, 1e3)))
>   R> object.size(M)
>   8000672 bytes
>   R>
> we'd still only pass the same 56 bytes a SEXP takes. See eg
> https://cran.r-project.org/doc/manuals/R-ints.html#SEXPs and play with memory
> profiling in R.

I tried memory profiling both of your versions with a long vector, and
found that the recommended Rcpp approach made an additional 8GB copy.
Is there a way to avoid this extra copy without resorting to in place


nate at ubuntu:~/R/byreference$ less abs.R

  cppFunction("NumericVector absCopy(NumericVector & x) { return abs(x); }")
  cppFunction("void absInPlace(NumericVector & x) { x = abs(x); }")

  xOrig = rnorm(1000*1000*1000)
  xRef = xOrig       # shallow copy shares memory
  xCopy = xOrig * 1  # deep copy is independent


  identical(xOrig, xRef)
  identical(xOrig, xCopy)

  xCopy = absCopy(xCopy)

  identical(xOrig, xRef)
  identical(xOrig, xCopy)

nate at ubuntu:~/R/byreference$ Rscript abs.R
  [1] TRUE
  [1] FALSE
  [1] TRUE
  [1] TRUE

nate at ubuntu:~/R/byreference$ cat absInPlace.txt
  2544 :"<Anonymous>" "absInPlace"

nate at ubuntu:~/R/byreference$ cat absCopy.txt
  8000000040 :"<Anonymous>" "absCopy"
  2544 :"<Anonymous>" "absCopy"

More information about the Rcpp-devel mailing list