簡體   English   中英

鏈表節點的大小

[英]Size of a linked list node

我發現這個事情有點棘手和遞歸,因為sizeof運算符如何計算鏈表中一個節點的大小。 我將以下結構作為列表中的一個節點,例如:

struct ll_core
{
    char c_ll;
    struct ll_core * next;
};

printf("size of struct ll_core = %d\n\n",sizeof(struct ll_core));

它給出了答案8.現在它如何決定大小8,因為要添加單個struct元素的大小,它會再次遇到相同的struct ll_core。 因此,在計算大小時,它是一種循環或遞歸。 請原諒我告訴我,如果我在想這樣的話,我會遺漏任何基本的東西。

它不再需要struct的大小,因為struct只包含指向 struct的指針 ,而不是struct本身。

“指向struct ll_core指針”的大小與struct ll_core大小struct ll_core ,它們是兩種不同的類型。 一個是指針,另一個不是。

你不能聲明一個“真正的”遞歸數據結構,因為它是無限的。

因為要添加單個struct元素的大小,它會再次遇到相同的struct ll_core

不,它遇到了一個指向 struct ll_core指針 如果遇到結構本身,那將導致無限大小。 編譯器知道struct ll_core *的大小和對齊要求,即使不知道任何關於struct ll_core ,因此它可以添加成員的大小加上對齊所需的填充(在本例中為next成員)以查找大小struct ll_core

假設您在32位機器上運行代碼,指針大小將為4個字節。 由於結構將在字邊界上對齊,因此將填充3個字節,因此大小將為8個字節。

這種結構實際上就像,

struct ll_core{
    char       c_11:
    char const byte[3];  //padded bytes for alignment reasons
    struct ll_core *next;
};
struct ll_core
{
    char c_ll;
    struct ll_core * next;
};

sizeof運算符添加結構ll_core成員的大小。 這是一個字符( c_ll )和一個指針( next )。

有關如何計算大小的更多信息。

結構填充:

在64位系統中,數據將以8字節塊的形式讀寫。 因此,當計算結構的大小時,就會發生填充。 意味着編譯器將在結構的成員之間插入一些間隙以“對齊”到體系結構地址邊界。 如下:

struct ll_core
{
    char c_ll;
    /* 7 bytes of padding */
    struct ll_core * next;
 };

因此,64位系統中此結構的大小將為16個字節。

結構包裝:

您可以通過執行結構打包來阻止編譯器執行結構填充。 在GCC中,它是這樣完成的:

struct __attribute__((__packed__)) ll_core
{
    char c_ll;
    struct ll_core * next;
};

現在64位機器上的大小將是9個字節。

sizeof(char) + sizeof(pointer)

編輯 - 從您的問題看來,您似乎在32位計算機上運行。 在32位機器中,數據將作為4字節塊讀取和寫入。

如果某些類型在某些地址上對齊,則許多處理器工作得更好 這意味着編譯器在單個char元素之后填充結構,以使指針位於本機字邊界上。

至於結構中的“遞歸”,沒有,因為next字段是指向結構的指針而不是結構本身。

你錯過了這一點,仔細看......“下一個”只是一個指針。 你不能只做'struct ll_core next'..那就是沒有*。 所以,只要它是一個指針。 將僅針對指針的大小計算大小。 通常,指針大小為4。

如果您有任何疑惑,請從下一步中刪除*並嘗試編譯代碼。

有兩個元素是char(大小為1)和一個指針(大小為4),因此您認為大小為5,但結構填充為4個字節(字大小)。 char填充為4個字節,總共8個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM