我正在尝试使用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参数?
答案 0 :(得分:1)
对于前两个示例,没有边界检查。边界检查很昂贵。你得到的是未定义的行为。在这种情况下的症状是你得到垃圾,但你也可能得到段错误。
您的第三个示例使用_
占位符来提取行。在构造表示行的概念的MatrixRow
对象时,抛出异常,因为没有这样的行。你可以推断在这里进行边界检查是值得的,因为它会检查&#34;整行&#34;。
你的上一个例子看起来像个bug。可能在Vector::offset