2013-10-22 7 views
10

मैं writing R extensions कई बार में कचरा संग्रहण के बारे में थोड़ा और अब पुन: पढ़ा है, और अभी भी इन दोनों उपयोगों के बीच का अंतर समझ में नहीं आता:असाइनमेंट पर सुरक्षा को वास्तव में क्या लपेटना चाहिए?

SEXP var = PROTECT(allocVector(STRSXP, 100)); 

बनाम

SEXP var; 
PROTECT(var = allocVector(STRSXP, 100)); 

अब तक मैंने पहले सत्र के साथ और भी बुरा भाग्य था क्योंकि मेरा सत्र कभी-कभी इसके साथ दुर्घटनाग्रस्त हो जाता है (फिर भी मैं इसे वास्तविक कोड और परिचय मार्गदर्शिका में बहुत कुछ उपयोग करता हूं)। क्या कोई इन दो असाइनमेंट के बीच अंतर को समझा सकता है?

संपादित करें:

के बाद कुछ प्रयोग मुझे लगता है कि मैं इस निष्कर्ष पर आ रहा हूँ वहाँ से ऊपर दो और व्यवहार मैं देख रहा हूँ आकस्मिक है दुर्घटनाग्रस्त में कोई अंतर के बीच कोई अंतर नहीं है, लेकिन से एक पुष्टिकरण की सराहना करेंगे किसी और अनुभवी।

+4

यह एक जवाब है, क्योंकि मुझे यकीन है कि के लिए पता नहीं है नहीं है, लेकिन पढ़ने 'rinter nals.h' मुझे बताता है कि 'SEXP' एक सूचक प्रकार है, और मैक्रो' प्रोटेक्ट 'बस लाइब्रेरी फ़ंक्शन' Rf_protect' के कॉल पर फैलता है। साथ में, इसका मतलब है कि 'सुरक्षा' ढेर पर चर के साथ कुछ भी चालाक नहीं कर रहा है; यह केवल * ऑब्जेक्ट * को अस्थायी जीसी रूट के रूप में 'allocVector' से वापस आने पर चिह्नित कर सकता है। इसलिए, दोनों संरचनाओं के बराबर होना चाहिए। (असाइनमेंट स्टेटमेंट का मान, 'var = ...', 'var' को लिखा गया मान है।) – zwol

उत्तर

7

यह सख्ती से बराबर है। इस समारोह (https://svn.r-project.org/R/trunk/src/main/memory.c से) की रक्षा से बुलाया

SEXP protect(SEXP s) 
{ 
    if (R_PPStackTop >= R_PPStackSize) 
    R_signal_protect_error(); 
    R_PPStack[R_PPStackTop++] = CHK(s); 
    return s; 
} 

static R_INLINE SEXP CHK(SEXP x) 
{ 
    /* **** NULL check because of R_CurrentExpr */ 
    if (x != NULL && TYPEOF(x) == FREESXP) 
    error("unprotected object (%p) encountered (was %s)", 
      x, sexptype2char(OLDTYPE(x))); 
    return x; 
} 
#else 
#define CHK(x) x 
#endif 

और from.include/Rinternals.h है:

#define TYPEOF(x) ((x)->sxpinfo.type) 

आप देख सकते हैं, सूचक तर्क में कोई बदलाव नहीं दिया जाता है ताकि

var = PROTECT(p) 
PROTECT(var = p) 

बराबर

संबंधित मुद्दे