我有一堆 Rcpp 代码,我必须将它们重写为无 Rcpp 的 C/C++ 扩展(由于它的许可),幸运的是,结果并没有我担心的那么痛苦。但是为了编写最干净的代码,我想确保我没有过度使用 PROTECT/UNPROTECT。 Writing R Extensions 文档提到“那么保护眼前的一切不是一个好主意......”所以我试图尽职尽责。

所以这就是我想检查的东西。在阅读为 R 编写 C 扩展的所有示例时,我看到了很多示例,其中作者保护传递的函数的参数,例如取自 this article

#include <R.h>
#include <Rdefines.h>
#include <string.h>
SEXP helloC1(SEXP greeting) {
  int i, vectorLength, stringLength;
  SEXP result;
  PROTECT(greeting = AS_CHARACTER(greeting));
  vectorLength = LENGTH(greeting);
  PROTECT(result = NEW_INTEGER(vectorLength));
  for (i=0; i<vectorLength; i++) {
    stringLength = strlen(CHAR(STRING_ELT(greeting, i)));
    INTEGER(result)[i] = stringLength;
  }
  UNPROTECT(2);
  return(result);
}

SEXP 问候作为参数传入,作者立即保护它。但是,从 Writing R Extensions 我注意到了这一点:



因此,为了健全性检查,有人可以告诉我这些作者保护传入参数的代码示例是否可以被修剪?如果是这种情况,我将能够使我的代码更清晰。

最佳答案

输入参数不需要受到保护,但您有一点误解—— protected 不是输入参数 greeting,而是由 SEXP 生成的新 AS_CHARACTER(greeting) 受到保护。

这有点令人困惑,因为 greeting 变量会立即重新分配,但实际上您现在有 greeting 指向一个全新的 SEXP ,而这个新对象需要垃圾收集器的保护。

关于c - 是否有必要保护 .Call 参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39791553/

10-12 16:09