[英]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.