繁体   English   中英

有人能告诉我这个 c 代码在做什么吗?

[英]Can someone tell me what this c code is doing?

Cansome 告诉我这个 cython 代码发生了什么。 完整代码可见:

https://github.com/scipy/scipy/blob/master/scipy/spatial/ckdtree.pyx

# this is the standard trick for variable-size arrays:
# malloc sizeof(nodeinfo)+self.m*sizeof(double) bytes.
cdef struct nodeinfo:
    innernode* node
    double side_distances[0]

这是一个旧的 C 把戏。 如果您不知道需要多少side_distances ,通常是因为它从一个nodeinfo实例到另一个实例不同,那么您将数组大小声明为零。 然后,当您为节点分配 memory 时,您分配结构的定义大小( sizeof(nodeinfo) ),加上额外的 memory 用于该特定实例中所需的值数量( +something * sizeof(double) )。 结果是,对于这个实例,我们有足够的 memory 用于我们指定大小的数组。

从某种意义上说,这是一个“技巧”,对于大多数用途,您可以分配一个单独的数组并将指向它的指针存储在该数组中。 将所有内容保存在一个分配中是一种(尝试的)优化。

不过,IIRC 仅允许 C++ 标准使用零大小的数组,而不是 C 标准。 在 C 中,您应该将其定义为灵活大小的数组side_distances[] ,尽管毫无疑问,许多编译器允许 C 中的 C++ 版本作为扩展。 但是,无论哪种方式,结构本身都不包含任何元素的空间,尽管它会为double正确对齐。

这就是 C 中的struct hack 我不知道它在 Python (或 cython )中的表现如何,但我认为你最好使用其他一些数据结构

在 C 中,它的用途是假装拥有“可变大小的数组”。
它需要动态分配 memory。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM