Rcpp是否支持针对NumericVector等类的自动边界检查?
Rcpp向量类边界检查机制说明
Rcpp确实为Rcpp::NumericVector、Rcpp::IntegerVector等所有派生自Rcpp::Vector的向量类型提供了成熟的边界检查机制,主要分为两类:
- 默认自带的分场景访问接口
Rcpp向量提供两种元素访问语法,无需额外配置即可按需选择:- 使用
[]运算符访问:默认无边界检查,性能和原生C++数组一致,适合性能敏感的生产环境代码 - 使用
()运算符访问:默认自带边界检查,一旦下标超出向量合法范围,会直接抛出带明确错误信息的R异常,开发调试阶段优先用这个语法即可快速定位越界问题
- 使用
- 编译宏全局强制开启边界检查
如果你希望统一给所有[]访问也加上边界检查,效果类似GCC的_GLIBCXX_ASSERTIONS,可以通过定义RCPP_DEBUG_LEVEL编译宏实现:- 单文件调试:在C++源文件最开头添加
#define RCPP_DEBUG_LEVEL 1即可生效 - 全项目/全包调试:在编译参数中添加
-DRCPP_DEBUG_LEVEL=1即可,如果是开发R包,可以在src/Makevars文件中添加一行PKG_CPPFLAGS += -DRCPP_DEBUG_LEVEL=1
开启该宏后,所有[]访问都会自动加上边界检查逻辑,越界时会抛出清晰的错误提示,正式发布时去掉宏定义即可完全消除检查带来的性能损耗,不会影响生产环境运行效率。
- 单文件调试:在C++源文件最开头添加
注:边界检查逻辑仅在访问向量元素时生效,不会改变向量本身的其他行为,也不会干扰其他代码的正常运行。
内容的提问来源于stack exchange,提问作者anymous.asker
相关产品推荐
相关产品推荐

