Rcpp如何检查Vector / Matrix边界?

时间:2014-04-10 19:56:29

标签: c++ r matrix rcpp

我正在尝试使用Rcpp查看边界检查的工作原理:

> cppFunction ('double fun(){NumericVector v(5); return v[-10];}', rebuild=T)
> fun()
[1] 1.782105e-316
> cppFunction ('double fun(){NumericVector v(5); return v[5];}', rebuild=T)
> fun()
[1] 5.323385e-316

> cppFunction ('NumericVector fun(){NumericMatrix v(5, 5); return v(6,_);}', rebuild=T)
> fun()
Error: index out of bounds
> cppFunction ('double fun(){NumericMatrix v(5, 5); return v(6,1);}', rebuild=T)
> fun()
[1] 0

我无法理解它是如何工作的。我期待索引超出范围'所有4个人的错误。我该怎么做才能使它始终适用于向量和矩阵?以下是编译的一些详细输出:

Generated R functions 
-------------------------------------------------------

`.sourceCpp_81484_DLLInfo` <- dyn.load('/tmp/RtmprtDNus/sourcecpp_5b065bfe9a2d/sourceCpp_20261.so')

fun <- Rcpp:::sourceCppFunction(function() {}, FALSE, `.sourceCpp_81484_DLLInfo`, 'sourceCpp_81484_fun')

rm(`.sourceCpp_81484_DLLInfo`)

Building shared library
--------------------------------------------------------

DIR: /tmp/RtmprtDNus/sourcecpp_5b065bfe9a2d

/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_20261.so' --preclean 'file5b0652a2d520.cpp' 
g++ -I/usr/share/R/include -DNDEBUG    -I"/home/user/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include" -fpic  -O3 -pipe  -g  -c file5b0652a2d520.cpp -o file5b0652a2d520.o
g++ -shared -o sourceCpp_20261.so file5b0652a2d520.o -L/usr/lib/R/lib -lR

我是否需要修改-O3或-DNDEBUG参数?

1 个答案:

答案 0 :(得分:1)

对于前两个示例,没有边界检查。边界检查很昂贵。你得到的是未定义的行为。在这种情况下的症状是你得到垃圾,但你也可能得到段错误。

您的第三个示例使用_占位符来提取行。在构造表示行的概念的MatrixRow对象时,抛出异常,因为没有这样的行。你可以推断在这里进行边界检查是值得的,因为它会检查&#34;整行&#34;。

你的上一个例子看起来像个bug。可能在Vector::offset