gpt4 book ai didi

c - 是否有必要保护 .Call 参数?

转载 作者:行者123 更新时间:2023-12-02 05:36:21 26 4
gpt4 key购买 nike

我有一堆 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我注意到了这一点:

Protection is not needed for objects which R already knows are in use. In particular, this applies to function arguments.



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

最佳答案

I have a bunch of Rcpp code that I have to rewrite as an Rcpp-free C/C++ extension (due to its license)



您可能需要一位(更好的)律师。 R 本身与 Rcpp 具有相同的许可证,因此“避免” Rcpp 对您的影响很小,因为链接的聚合仍然是 GPL 2 或更高版本。

编辑:只是为了踢球,这里有两个更简单和更短的函数实现。您可能会发现它们更易于阅读和使用。否 PROTECT在用户空间跳舞,因为 Rcpp 会处理这一切。
#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector helloC2(CharacterVector v) {
IntegerVector res(v.size());
for (int i=0; i<v.size(); i++) {
res[i] = strlen(v[i]);
}
return(res);
}

// [[Rcpp::export]]
IntegerVector helloC3(CharacterVector v) {
return wrap(sapply(v, strlen));
}

它们产生(当然)与您的函数相同的输出。

首先,你的:
R> system("cd /tmp && R CMD SHLIB prot.c")
R> dyn.load("/tmp/prot.so")
R> .Call("helloC1", c("the", "quick", "brown", "fox"))
[1] 3 5 5 3
R>

接下来,我的:
R> Rcpp::sourceCpp("/tmp/prot.cpp")
R> helloC2(c("the", "quick", "brown", "fox"))
[1] 3 5 5 3
R> helloC3(c("the", "quick", "brown", "fox"))
[1] 3 5 5 3
R>

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com