首页 > 解决方案 > kh (C++ KDB) 中 K->G0 的奇怪定义

问题描述

我查看了 K 定义和宏 kF:

typedef struct k0{
  signed char m,a,t;
  C u;
  I r; 
  union {G g;H h;I i;J j;E e;F f;S s;struct k0*k;struct{J n;G G0[1];};};
  }*K;
#define kG(x)   ((x)->G0)
#define kF(x)   ((F*)kG(x))

根据手册,我们可以访问kF(x)[42]获取向量的第 42 个元素,但是在使用所有宏后,应该生成以下代码

F i = ((F*)(x->G0))[42]

G G0[1]但我认为to的转换存在问题(F*) G0,因为我们可能会耗尽分配给 struct ( sizeof(G[1])==1and sizeof(F*)==8) 的内存。

我认为应该将定义从 更正G G0[1]G* G0。我哪里错了?

标签: c++kdb

解决方案


当您在 kdb 中处理对象时,可以将 K 结构(实际上是 k0 结构,因为 K 实际上是指向 k0 结构的指针)视为列表的标题。如果您的 K 对象实际上是一个列表,那么 G0 确实标志着列表开始的位置。例如,可以按如下方式分配 16 个浮点数的列表。

K my_list = malloc(offsetof(struct k0, G0) +  sizeof(F) * 16);
my_list->t = KF;
my_list->n = 16;

看看这里 k0 结构是如何真正占用内存的开头的,并且在它从 G0[0] 开始之后为数组分配了额外的空间,有足够的空间容纳 16 个浮点数。

请注意,kdb 实际上并不使用 malloc,因为它们有某种内存池。以上只是它如何工作的简化示例。


推荐阅读