1 पर विचार करें) एक संभावित बड़े मेमोरी प्रिंट के साथ एक कस्टम क्लास, और 2) एक शीर्ष-स्तरीय फ़ंक्शन जो कुछ पूर्व-प्रसंस्करण करता है, फिर हमारे कस्टम क्लास का एक नया ऑब्जेक्ट बनाता है और वापस करता है। मूल्य द्वारा अनावश्यक नकल से बचने के लिए, फ़ंक्शन ऑब्जेक्ट को आवंटित करता है और इसके बजाय एक पॉइंटर लौटाता है।
पिछली चर्चा के आधार पर , ऐसा लगता है कि एक नव-निर्मित वस्तु के लिए एक सूचक को वापस करने का उचित तरीका इसके साथ लपेटना है Rcpp::XPtr<>
। हालांकि, आर फिर इसे प्रभावी ढंग से के रूप में देखता externalptr
है, और मैं आधुनिक के साथ कास्ट करने के लिए उचित रास्ता खोजने के लिए संघर्ष कर रहा हूँ RCPP_EXPOSED_CLASS
और RCPP_MODULE
काम करने के रास्ते।
विकल्प कच्चे सूचक को वापस करना है। लेकिन फिर मैं 100% निश्चित नहीं हूं कि ऑब्जेक्ट मेमोरी ठीक से साफ हो जाती है। मैं valgrind
स्मृति लीक के लिए परीक्षण करने के लिए दौड़ा , और यह किसी भी नहीं मिला। हालाँकि, सफाई कौन करता है? आर?
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")
;
}
में आर
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<>
रिटर्निंग पॉइंट्स का उचित तरीका है, और यदि हां, तो मुझे परिणाम के रूप में देखने के लिए आर कैसे मिलेगा Double
, नहीं externalptr
? वैकल्पिक रूप से, यदि एक कच्चे पॉइंटर को वापस करने से मेमोरी की समस्या पैदा नहीं होती है, तो फ़ंक्शन बनाने वाली वस्तु को कौन साफ करता है?
CustomClass*
। असली एप्लिकेशन एक कस्टम डेटा संरचना है जिसमें कोई आर समतुल्य नहीं है और सभी इंटरैक्शन ए द्वारा उजागर कार्यक्षमता के माध्यम से किए जाते हैं RCPP_MODULE
। मेरे द्वारा खोजा गया निकटतम मैच 7 साल पहले की एक पोस्ट थी , जहाँ ऐसा लगता है कि मुझे एक template <> CustomClass* as()
कन्वर्टर को परिभाषित करने की आवश्यकता है । हालाँकि, मैं इस बारे में स्पष्ट नहीं हूँ कि इसे किस तरह से बातचीत करनी चाहिए RCPP_MODULE
और RCPP_EXPOSED_CLASS
, खासकर जब से मुझे लगा कि उत्तरार्द्ध पहले से परिभाषित है wrap()
और as()
।
RCPP_EXPOSED_CLASS
और RCPP_MODULE
वास्तव में इसे करने का तरीका है? मैंने पहले कभी ऐसा इस्तेमाल या देखा नहीं है।
Rcpp::XPtr
C ++ कोड से एक बाहरी पॉइंटर बनाना चाहते हैं । और आप इसे करना चाहते हैंdouble *
या आपका पेलोड जो भी हो। यहाँ गैलरी में, GitHub में उदाहरण होने चाहिए ... शायद एक प्रेरित खोज के साथ आप कुछ काफी करीब पा सकते हैं?