ลองพิจารณา 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")
;
}
ในอาร์
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
อย่างไร อีกวิธีหนึ่งถ้าส่งกลับตัวชี้แบบ raw ไม่ทำให้เกิดปัญหาหน่วยความจำใครล้างข้อมูลวัตถุที่ฟังก์ชันสร้างขึ้น
CustomClass*
จริงๆ การประยุกต์ใช้จริงเป็นโครงสร้างข้อมูลที่กำหนดเองที่ไม่มี R RCPP_MODULE
เทียบเท่าและปฏิสัมพันธ์ทั้งหมดจะทำผ่านการทำงานเปิดเผยโดย การจับคู่ที่ใกล้เคียงที่สุดที่ฉันค้นพบซึ่งเป็นแรงบันดาลใจคือโพสต์เมื่อ 7 ปีที่แล้วซึ่งดูเหมือนว่าฉันต้องกำหนดตัวtemplate <> CustomClass* as()
แปลง แต่ผมไม่มีความชัดเจนเกี่ยวกับวิธีการที่มันควรจะโต้ตอบกับRCPP_MODULE
และRCPP_EXPOSED_CLASS
โดยเฉพาะอย่างยิ่งนับตั้งแต่ฉันคิดว่าหลังกำหนดไว้แล้วและwrap()
as()
RCPP_EXPOSED_CLASS
และRCPP_MODULE
เป็นวิธีที่จะทำจริง ๆ หรือไม่ ฉันไม่เคยใช้หรือเห็นสิ่งนั้นมาก่อน
Rcpp::XPtr
สร้างตัวชี้ภายนอกจากรหัส C ++ และคุณต้องการที่จะโยนมันทำdouble *
หรือสิ่งที่คุณโหลด ควรมีตัวอย่างที่นี่ที่แกลลอรี่ที่ GitHub ... บางทีด้วยการค้นหาที่มีแรงบันดาลใจคุณสามารถค้นหาบางสิ่งที่อยู่ใกล้พอ