Nic*_*ick 5 c++ move-semantics rcpp c++11
我实现了一个算法,C++它返回一个巨大的元素数组作为输出。现在,我想实现一个包装器,Rcpp以便我能够使用R.
我在 Makevars 文件中指定了以下设置:
PKG_CXXFLAGS = -std=c++11
这样我就可以使用 C++11 版本了。
// [[Rcpp::export]]
NumericMatrix compute(int width, int height)
{
vector<data_t> weights(width * height);
compute_weights(weights);
NumericMatrix mat(height, width);
copy(begin(weights), end(weights), mat.begin());
return mat;
}
Run Code Online (Sandbox Code Playgroud)
如果函数返回时 NumericMatrix 被移动,则上述包装函数仍然有效,否则将创建一个新对象。
是否Rcpp利用移动语义?如果没有,是否有任何解决方法可以避免构建副本?
如果函数返回时移动 NumericMatrix,则上述包装函数仍然有效,否则将创建一个新对象。
...如果没有,是否有任何解决方法可以避免构建副本?
我认为复制构造函数只创建了浅表副本,因此不应该有任何副本。请参阅Rcpp:如何确保 NumericMatrix 的深度复制?和
这个例子也证实了这一点
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::NumericVector allocate_the_vec(R_xlen_t n_ele){
Rcpp::NumericVector out(n_ele);
return out;
}
/*** R
# got 16 GB ram on my laptop. 3 x 7 is an issue but 2 x 7 is not
how_large <- as.integer(7 * 10^9 / 8)
the_large_vec_1 <- allocate_the_vec(how_large)
object.size(the_large_vec_1)
the_large_vec_2 <- allocate_the_vec(how_large)
*/
Run Code Online (Sandbox Code Playgroud)