[Rcpp-devel] Some questions regarding internals of Rcpp objects
Ulrich Bodenhofer
bodenhofer at bioinf.jku.at
Fri Aug 5 11:45:55 CEST 2011
Dear list members,
I have started developing a package using the latest version of Rcpp
just recently, so I am more or less an Rcpp newbie. Since I am not
sufficiently proficient in advanced C++ (and admittedly too lazy too) to
analyze the Rcpp source code, I have some questions regarding what
actually happens inside Rcpp. Let me bother you with an example:
RcppExport SEXP test(SEXP mat)
{
BEGIN_RCPP
Rcpp::NumericMatrix matC(mat);
Rcpp::NumericMatrix matD(mat);
matC(1, 1) = 1;
matD(1, 1) = -matD(1, 1);
return(matC);
END_RCPP
}
If I call this function on some matrix, then the function returns the
input matrix with its element [2, 2] set to 1, but that's all. The
change in matD only seems to have an effect on the local copy matD. If I
replace "return(matC)" by "return(matD)", then the function returns the
input matrix with the sign of its element [2, 2] inverted, so the change
in matC has no effect. That Rcpp creates local copies, i.e. that matC
and matD are independent objects each holding local copies of the
argument mat, would perfectly explain these results. Previously,
however, I thought Rcpp would only wrap an R/SEXP object into an Rcpp
object without making a copy. If it was so, no matter whether the
function returns matC or matD, the function would return the input
matrix with -1 on position [2, 2]. Did I get this point wrong? I suppose
it would save time and memory not to create a copy, in particular, since
arguments to functions are local copies already. Is there a way to avoid
copying?
A related question is what the "=" operator does. Does
Rcpp::NumericVector x = ...;
create a copy or is it only a pointer that is assigned?
My final question concerns the "longevity" of Rcpp objects. Suppose I do
the following:
{
Rcpp::NumericVector vec(10);
double *p = vec.begin();
}
Can I use *p outside this block or is the pointer killed along with the
variable vec after the block is closed? According to my limited
knowledge, I would assume that it is only the reference vec that is not
available outside the block, but that the corresponding R object still
exists and will be deleted by the R garbage collector only after the
whole function has terminated.
Any help is gratefully appreciated! I am sorry if these are stupid
questions or if any of them have been discussed previously.
Thanks and best regards,
Ulrich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20110805/18463a4d/attachment.htm>
More information about the Rcpp-devel
mailing list