[英]How sizeof operator works for a structure
我正在閱讀K&R。 在一個示例中,它將結構數組定義為:
struct key {
char * word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
/*more members*/
"while", 0
};
然后,要計算數組的大小,它使用兩種方法:
1) #define NKEYS (sizeof keytab/ sizeof(struct key))
2) #define NKEYS (sizeof keytab/ sizeof keytab[0])
然后,它說第二種方法的優點是,如果類型更改,則無需更改。 有人可以告訴我最后一行的含義嗎? 在這里談論什么優勢?
如果將來您將keytab
數組更改為與struct key
不同的類型,則必須更改第一行sizeof,因為該類型是在此處明確寫入的。 第二行sizeof行將保持工作狀態,因為它沒有命名類型,而是采用數組元素的任何類型。
“ 有人能告訴我最后一行的含義嗎? ”
真的很簡單。 當您聲明某物(任何東西)的數組時,每個元素都是該類型的sizeof
。 (例如, int array[10] = {0};
聲明並初始化一個由10個元素組成的int
數組sizeof (int)
。該數組的每個元素都具有sizeof (int)
。
您可以使用array[x]
(其中x為0-9
)訪問每個元素。 任何元素,例如array[0]
都是一個int
。 (就像*array
是對第一個元素的引用一樣-其中array[0]
只是指針表示法中的*(array + 0)
,當然,它只是*(array)
或*array
,因為括號是然后沒有必要)。
返回struct
數組的大小。 sizeof keytab
給出數組中字節的總數。 sizeof keytab[0]
給出每個元素中的字節數。 因此sizeof keytab / sizeof keytab[0]
是數組中元素的數量。 它與編寫sizeof keytab / sizeof *keytab
或sizeof keytab / sizeof (struct key)
。
為什么? 因為sizeof keytab[0]
只是sizeof (struct key)
。 但是,如果您根據sizeof (struct key)
確定元素的數量,然后更改類型,則所有具有sizeof (struct key)
代碼都會出錯,但是如果您使用sizeof keytab[0]
尺寸設置,您的代碼將繼續具有正確數量的元素,因為您是根據sizeof "an element"
而不是sizeof (an arbitrary type name)
。
對於1),代碼需要假定我們正在查看struct key
類型的成員數組。
對於2),代碼不需要知道這一點。
出於可維護性的原因,這被認為是2)的優勢。
考慮幾個在項目上工作的人,一個將數組的定義更改為
struct key2 {
char * word;
int count;
int coolness;
} keytab[] = /* ... */
並將struct key
的定義與其他地方分開,與您的代碼相同。 另一個負責帶有size宏定義的代碼部分。
然后1)變成錯誤,但2)保持正確。
因此1)將需要兩個開發人員之間進行額外的同步,這意味着需要付出額外的努力並有出錯的風險。
有人可以告訴我最后一行的含義嗎?
使用struct key
類型獲取數組元素的實際數量
在這里談論什么優勢?
除了不明確依賴某種類型的優勢外,
編譯器可以使用實際定義對宏進行更多優化。 與sizeof(type)
相比, sizeof(var)
優化效果更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.