Rcpp如何检查矢量/矩阵边界

How does Rcpp check Vector/Matrix boundaries?

本文关键字:边界 何检查 检查 Rcpp      更新时间:2023-10-16

我正在试验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参数吗?

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

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

您的最后一个示例看起来像一个bug。可能在Vector::offset 中