繁体   English   中英

结构中数组的内存分配

[英]Memory allocation of array in a struct

我阅读了redis的代码,它定义了一个结构:

typedef struct zskiplistNode {
    robj *obj;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned int span;
    } level[];
} zskiplistNode;

它创建像这样的节点:

zskiplistNode *zn = zmalloc(sizeof(*zn)+level*sizeof(struct zskiplistLevel));

就是说,如果zn的地址是0x10000 ,那么&(zn->level[0])0x10000+sizeof(zskiplistNode) ,数组的内存地址在struct后面?

zn->level (一个灵活的数组成员)具有一些固定的偏移量wrt zn :如果zn位于地址0x10000 ,则zn->level[0]可以位于地址0x10018因为指针robj将占用一个8字节的字(假定为64)位x86机器)和双精度score将占用另一个8字节的单词-并且应将其与单词对齐-并且backward的指针将占用另一个单词。 因此zn->level偏移了3个字,即24个字节(即十六进制为0x18 )。

顺便说一句,编译器或ABI可能会在您的结构中插入空白(为了对齐或符合ABI)。 在您的特定示例中,可能不会(在Linux / x86-64上使用GCC)。

您可能对标准offsetof宏以及“ sizeof ”的sizeof感兴趣。

暂无
暂无

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

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