1)潜在的に大きなメモリプリントを含むカスタムクラス、および2)前処理を実行してからカスタムクラスの新しいオブジェクトを作成して返すトップレベルの関数を検討してください。値による不要なコピーを回避するために、関数はオブジェクトを割り当て、代わりにオブジェクトへのポインターを返します。
以前の議論に基づいて、新しく作成されたオブジェクトへのポインタを返す適切な方法は、それをでラップすることRcpp::XPtr<>
です。しかし、Rはそれを効果的にと見なしexternalptr
、私はそれをモダンRCPP_EXPOSED_CLASS
でRCPP_MODULE
物事のやり方にキャストする適切な方法を見つけるのに苦労しています。
別の方法は、生のポインタを返すことです。しかし、オブジェクトメモリが適切にクリーンアップされるかどうかは100%確実ではありません。私はvalgrind
メモリリークをテストするために実行しましたが、何も見つかりませんでした。しかし、誰が片付けをしますか?R?
test.cpp
#include <Rcpp.h>
// Custom class
class Double {
public:
Double( double v ) : value(v) {}
double square() {return value*value;}
private:
double value;
};
// Make the class visible
RCPP_EXPOSED_CLASS(Double)
// Option 1: returning raw pointer
Double* makeDouble( double x ) {
Double* pd = new Double(x);
return pd;
}
// Option 2: returning XPtr<>
SEXP makeDouble2( double x ) {
Double* pd = new Double(x);
Rcpp::XPtr<Double> ptr(pd);
return ptr;
}
RCPP_MODULE(double_cpp) {
using namespace Rcpp;
function( "makeDouble", &makeDouble );
function( "makeDouble2", &makeDouble2 );
class_<Double>("Double")
.constructor<double>("Wraps a double")
.method("square", &Double::square, "square of value")
;
}
Rで
Rcpp::sourceCpp("test.cpp")
d1 <- makeDouble(5.4) # <-- who cleans this up???
# C++ object <0x56257d628e70> of class 'Double' <0x56257c69cf90>
d1$square()
# 29.16
d2 <- makeDouble2(2.3)
# <pointer: 0x56257d3c3cd0>
d2$square()
# Error in d2$square : object of type 'externalptr' is not subsettable
私の質問はRcpp::Xptr<>
、ポインタを返す適切な方法であるかどうかであり、そうである場合、Rに結果をDouble
ではなく、として表示させるにはどうすればよいexternalptr
ですか?あるいは、生のポインタを返すことでメモリの問題が発生しない場合、関数が作成したオブジェクトを誰がクリーンアップしますか?
CustomClass*
。実際のアプリケーションは、Rに相当するものがないカスタムデータ構造であり、すべての対話はによって公開されている機能を介して行われRCPP_MODULE
ます。やる気のある検索で見つかった最も近い一致は7年前の投稿で、template <> CustomClass* as()
コンバーターを定義する必要があるようです。しかし、私はそれが対話する方法に不明瞭だRCPP_MODULE
とRCPP_EXPOSED_CLASS
、私は後者がすでに定義されたと思った、特に以来wrap()
とas()
。
RCPP_EXPOSED_CLASS
しRCPP_MODULE
て本当にそれを行う方法ですか?これまでに使用したことも見たこともありません。
Rcpp::XPtr
C ++コードから外部ポインターを作成する必要があります。そして、あなたはそれをキャストしたい、double *
またはあなたのペイロードが何であれ。ここ、Gallery、GitHubに例があるはずです...やる気のある検索で、十分に近いものを見つけることができますか?