代码之家  ›  专栏  ›  技术社区  ›  dww Jarretinha

RCpp向量的sizeof返回什么

  •  1
  • dww Jarretinha  · 技术社区  · 6 年前

    我想知道c++ sizeof 在RCpp向量上操作时执行。例如:

    library(Rcpp)
    cppFunction('int size_of(NumericVector a) {return(sizeof a);}')
    size_of(1.0)
    # [1] 16
    

    这将返回传递给它的任何数字或整数向量的值16。

    同样如此

    cppFunction('int size_of(IntegerVector a) {return(sizeof a);}')
    size_of(1)
    # [1] 16
    

    我认为R中的数字是8字节,整数是4字节。这是怎么回事?动机是使用 memcpy 在RCpp向量上,需要知道其大小。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Dirk is no longer here    6 年前

    每件事 我们从R传递到C(++),返回的是a SEXP 类型--a 指针 到S表达式。

    如果我们推广你的函数,让 SEXP 在中,我们可以看到一些有趣的事情:

    R> Rcpp::cppFunction('int size_of(SEXP a) {return(sizeof a);}')
    R> size_of(1L)    ## single integer -- still a pointer
    [1] 8 
    R> size_of(1.0)   ## single double -- still a pointer
    [1] 8
    R> size_of(seq(1:100))   ## a sequence ...
    [1] 8
    R> size_of(help)         ## a function
    [1] 8
    R> size_of(globalenv)    ## an environment
    [1] 8
    R> 
    

    简而言之,您在编译时C++类型分析操作符之间遇到了麻烦( sizeof )以及运行时特性,即所有内容都将变形为 SEXP 类型对于实际向量,您可能需要 size() length() 成员函数等。

        2
  •  2
  •   Lightness Races in Orbit Shash316    6 年前

    你必须了解 NumericVector IntegerVector 实现以发现它们静态占用一定数量字节的原因。

    根据您在此上下文中对“数字”或“整数”大小的观察,值16可能说明以下任何/所有情况:

    • 指向[动态分配?]的指针数据
    • 容器的当前逻辑大小(元素数)
    • 任何其他元数据

    理想情况下,不要使用 memcpy 将一个对象的状态转移到另一个对象,除非 绝对肯定 它是一个只有内置类型成员的普通对象。如果我猜对了 数字向量 ,使用 memcpy公司 它将违反其所有权语义,因此是不正确的。有 other ways to copy R vectors