python 代码 dictobject.c 中的 marco `DK_ENTRIES` 是什么意思

what 's meanning of the marco `DK_ENTRIES` in cpython code dictobject.c

我看了dictobject.c的代码,搞不懂这个

#define DK_ENTRIES(dk) \
    ((PyDictKeyEntry*)(&((int8_t*)((dk)->dk_indices))[DK_SIZE(dk) * DK_IXSIZE(dk)]))

谁能解释一下这个宏,帮我看看这个宏是干什么用的?

经过一番挣扎,我找到了下面的东西:

第一个dkPyDictKeysObject:

typedef struct _dictkeysobject PyDictKeysObject;
struct _dictkeysobject {
    Py_ssize_t dk_refcnt;
    Py_ssize_t dk_size;
    dict_lookup_func dk_lookup;
    Py_ssize_t dk_usable;
    Py_ssize_t dk_nentries;
    char dk_indices[];
};

注意最后一个元素dk_indices 灵活数组成员

简单地说,

DK_SIZE是struct中的dk_size

DK_IXSIZE可以是1或2或4或8

((int8_t*)((dk)->dk_indices))[DK_SIZE(dk) * DK_IXSIZE(dk)]

是一个有n(dk_size*1?)偏移量的指针

和结尾 return 指向 PyDictKeyEntry

的指针

最后,这个宏 return 一个 PyDictKeyEntry,其中有 n(dk_size*1?)dk->dk_indices

的偏移量