Rf_allocVector 只分配内存,不清零内存

Rf_allocVector only allocates and does not zero out memory

这背后的最初动机是我有一个动态大小的浮点数组,我想通过 Rcpp 将其传递给 R,而不会产生清零成本或深度复制成本。

最初我以为可能有一些方法可以获取堆分配的数组,让 R 的 gc 系统知道它,然后用其他数据将它包装起来以创建一个“Rcpp::NumericVector”,但似乎就是这样不可能 - 或者以我目前的知识是可行的。

但是,如果我错了,请纠正我,它看起来就像简单地构造一个大小为 N 的 NumericVector,然后将其用作 N 大小的分配将调用 R.h 的 Rf_allocVector 并且本身不会将分配的数组清零——我在一个小的 C 程序上测试了它,该程序将 dyn.loaded 放入 R 中,它看起来像垃圾值。我也看了一眼装配,似乎没有任何归零。

任何人都可以证实这一点或提供任何替代解决方案吗?

欢迎使用 Whosebug。

你标记了这个 rcpp 但这是 R 的 C API 的一个函数——而 Rcpp API 为你提供了它的构造函数 do 实际上将内存 tp 设置为零:

> Rcpp::cppFunction("NumericVector goodVec(int n) { return NumericVector(n); }")
> sum(goodVec(1e7))
[1] 0
> 

这将使用 R 的内存函数创建一个动态分配的向量。该向量与 R 自己的向量没有区别。并且它的内存设置为零 因为我们使用 R_Calloc,它记录在 Writing R Extension 中以将内存设置为零。 (我们也可能明确地使用 memcpy(),你可以查看来源。)

所以简而言之,您只是对 R 的 C API 以及 Rcpp 提供的内容以及什么时候最容易使用感到困惑。继续阅读文档、运行 和编写示例,并研究现有代码。都在那里!