Может ли Rcpp выполнять автоматическую проверку границ?

#rcpp

Вопрос:

В C при использовании vector типов из STL некоторые компиляторы, такие как GCC, имеют такие параметры компиляции, как, например _GLIBCXX_ASSERTIONS , принудительное добавление связанных проверок для векторов в отладочных сборках, так что если я попытаюсь получить доступ к элементу в позиции, превышающей вектор, это приведет к ошибке.

У RcppArmadillo есть аналогичный макрос отладки, который можно включить для проверки границ.

Есть ли в Rcpp что-то подобное для таких классов, как Rcpp::NumericVector или Rcpp::IntegerVector ?

Ответ №1:

Да, это так:

 > Rcpp::cppFunction("IntegerVector foo(IntegerVector v) { v.at(11) = 42L; 
                     return v; }")
> foo( 1:10 )
Error in foo(1:10) : Index out of bounds: [index=11; extent=10].
> 
 

Вы также можете рассмотреть RcppArmadillo, где у Armadillo есть проверки по умолчанию с возможностью отключения:

 > Rcpp::cppFunction("arma::vec foo(arma::vec v) { v(11) = 42L; 
                     return v; }", depends="RcppArmadillo")
> foo( 1:10 )
Error in foo(1:10) : Mat::operator(): index out of bounds
> 
 

Комментарии:

1. Но для этого вам пришлось воспользоваться .at() , в то время _GLIBCXX_ASSERTIONS operator[] как вы тоже можете включить его. Будет ли #define для этого какой-то вариант или нет?