c++ - 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])==1
and sizeof(F*)==8
) 的内存。
我认为应该将定义从 更正G G0[1]
为G* G0
。我哪里错了?
解决方案
当您在 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,因为它们有某种内存池。以上只是它如何工作的简化示例。
推荐阅读
- android - 使用 Chart.js 的 WebView 无法转换为位图
- unity3d - 如何在 Unity 中使用 PUN 制作小型锦标赛大厅?
- java - SearchView 文本颜色没有改变
- tensorflow - 为每个步骤保存 TensorFlow 检查点
- python - 从独立的软件中执行脚本
- json - 如何使用节点JS更改在JSON中多次重复的特定键的值
- kubernetes - GCP (GKE) Anthos Config Management admission-webhook 反复以 OOMKilled 状态死机
- javascript - 如何仅在单击该行时展开该行?
- maven - 当 pom 依赖版本过时时的 IntelliJ 警告
- r - 根据其他几个变量改变一个变量