1) 잠재적으로 큰 메모리 인쇄를 가진 사용자 정의 클래스와 2) 일부 전처리를 수행 한 다음 사용자 정의 클래스의 새 오브젝트를 작성하여 리턴하는 최상위 기능을 고려하십시오. 값으로 불필요한 복사를 피하기 위해 함수는 객체를 할당하고 대신 포인터를 반환합니다.
이전 토론을 바탕으로 새로 만든 객체에 대한 포인터를 반환하는 올바른 방법은로 래핑하는 것 같습니다 Rcpp::XPtr<>
. 그러나 R은 그것을 효과적으로 것으로보고 externalptr
있으며 현대 RCPP_EXPOSED_CLASS
와 그것을 캐스팅하는 적절한 방법을 찾기 위해 고심 하고 있습니다.RCPP_MODULE
일하는 하고 있습니다.
대안은 raw 포인터를 반환하는 것입니다. 그러나 객체 메모리가 올바르게 정리되었는지 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")
;
}
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 *
하거나 당신의 페이로드가 무엇이든 캐스팅하려고합니다 . 갤러리, GitHub에 여기에 예제가있을 것입니다 ... 동기 부여 된 검색으로 충분히 가까운 것을 찾을 수 있습니까?