Rcpp如何检查矢量/矩阵边界
How does Rcpp check Vector/Matrix boundaries?
我正在试验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 中
相关文章:
- std::数组边界检查如何工作?
- BoostSpirit.Qi-针对原始数据类型进行边界检查
- 在哪种情况下,C++会在编译时进行数组边界检查?
- 使用 auto 时不检查数组边界
- 迭代器边界检查超出向量大小
- 使用无符号数字进行图像边界检查
- OpenGL 检查屏幕边界
- 自动检查 std::vector 中的边界
- 检查子对象的地址是否在包含对象的边界内是否合法
- 无法安装 MPX 运行时驱动程序(用于边界检查)
- 自动矢量边界检查而不会破坏我的程序
- `sTD :: bitset`带有和没有边界检查
- C++ - 最快的检查数组边界
- 使用硬件内存保护对64位硬件进行数组边界检查
- 在检查矢量边界的同时运行光标
- 无符号整数的类型双关语是否可以通过消除 >= 比较的需要来加快边界检查速度?
- 编译器/JIT 优化 Java 和 C++ 中 for 循环的边界检查
- 用可以检查边界 c++ 的东西替换数组的最接近的解决方案
- 环形缓冲区的有效边界检查
- c++中的动态分配不检查数组边界