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

问题描述 投票:0回答:1

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

最初我以为可能有某种方法可以获取堆分配的数组,使其了解 R 的 gc 系统,然后将其与其他数据一起包装以创建“Rcpp::NumericVector”,但似乎这是不可能的 - 或者以我目前的知识是可行的。

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

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

r c rcpp rcpp11
1个回答
1
投票

您标记了此

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
提供什么以及什么时候最容易使用感到困惑。继续阅读文档、运行和编写示例以及研究现有代码。一切都在那里!

© www.soinside.com 2019 - 2024. All rights reserved.