簡體   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