[Rcpp-devel] Rcpp vector classes vs std::vector for custom class member variables

Romain Francois romain at r-enthusiasts.com
Tue Oct 8 15:07:11 CEST 2013


Le 08/10/13 14:53, Jon Clayden a écrit :
> Thanks Dirk and Romain for your helpful replies. To follow up briefly...
>
>         I'm defining a custom class, an object of which will need to survive
>         across various calls back and forth between R and C++, so I plan
>         to use
>         the XPtr class to wrap a pointer. My question is, what are the
>         advantages and disadvantages of using Rcpp vector classes (vs
>         std::vector) for member variables? To be more concrete, I mean
>
>         class Foo
>         {
>         private:
>             Rcpp::NumericVector bar;
>         }
>
>         vs
>
>         class Foo
>         {
>         private;
>             std::vector<double> bar;
>         }
>
>         Are there garbage collection issues when these live inside an
>         XPtr<Foo>?
>
>
>     No. An XPtr<Foo> will delete the object it points to, using Foo's
>     destructor when it goes out of scope.
>
>
> Sure. And the memory allocated to "bar" (if it's a NumericVector) will
> be protected from the garbage collector until the Foo object is deleted?

yes

>     I would argue against using external pointers directly when you can
>     use modules and experience more type safety than with direct
>     external pointers.
>
>     But these (using external pointers and using modules) only make
>     sense when you want to be able to hold a reference to your object at
>     the R level, do you ?
>
>
> I think I do... ;)  I need the object to hold state and not be
> deallocated between calls into the C++ code. I also want to allow for
> the possibility that multiple Foo objects exist, and are being operated
> on simultaneously. So holding a handle on the R side and passing it back
> to each C++ function that works with the object seems like the natural
> approach to me.

I'd strongly advise to consider using modules as the vessel for that 
sort of things.

This way, on the R side, you have something concrete instead of 
something opaque. R does not know what is inside an external pointer, 
but a module object, you have access to its fields, methods, etc ...

>         Are there speed advantages of std::vector<double> over
>         Rcpp::NumericVector for general use? Any input would be welcome.
>         Thanks
>         in advance.
>
>
>     This is premature optimization. What you want to ask yourself is
>     what are you going to do with "bar". If bar goes back and forth
>     between the C++ and the R side, then NumericVector is your best
>     candidate.
>
>
> Agreed, but it's a consideration. I fully accept that the choice depends
> on the particular application, as you and Dirk both said. I was just
> wondering what the baseline performance difference (if any) might be.

There is no such answer. It really depends on what you do with bar

>     If bar is something internal to your class, then std::vector<> is
>     fine and will give you a more complete interface, will grow
>     efficiently, etc ...
>
>     If you really want to have the best performing class for your
>     application, you need to measure it.
>
>     It is easy enough to make Foo a template and switch between the two
>     in benchmarking:
>
>     template <typename Container>
>     class Foo {
>
>     private:
>              Container bar ;
>     } ;
>
>     Foo< std::vector<double> > f1;
>     Foo< Rcpp::NumericVector > f2;
>
>
>         Great work on Rcpp, by the way. I've been hearing very good
>         things for
>         quite some time, but wasn't sure if it was worth dusting off my
>         slightly
>         rusty C++ for. Suffice to say I think it was. The API is very
>         clean and
>         returning to the standard R API will be painful...!
>
>
>     Great. You don't need expert knowledge of C++ for Rcpp to be useful.
>
>
> Sure, but I'm doing quite a bit in native code so there's little point
> in dropping competent C code for badly-written C++. Yes, I could mix
> them, but it's nice to be able to make the most of the tools available... :)

Sure. Refactoring existing C code into C++ is kind of hard, but writing 
new C++ code instead of new C code is easier. At least it is from my 
perspective.

-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30



More information about the Rcpp-devel mailing list