簡體   English   中英

帶有類型或變量的“C”sizeof

[英]“C” sizeof with a type or variable

最近看到有人贊揚另一個用戶使用sizeof var而不是sizeof(type)。 我一直以為這只是一種風格選擇。 有什么顯着差異嗎? 例如,具有f和ff的線被認為比具有g和gg的線更好:

 typedef struct _foo {} foo;

 foo *f = malloc(count * sizeof f);
 foo *g = malloc(sizeof(foo) * count);

 foo **ff = malloc(count * sizeof *ff);
 foo **gg = malloc(sizeof(foo*) * count);

在我看來,第一組只是風格問題。 但是在第二對線中,額外的第二個*很容易混淆乘法。

如果更改了變量的類型,則如果變量是參數而不是類型,則sizeof不需要更改。

關於@ icepack的評論:類型與變量名稱的變化的可能性或可​​能性不是問題。 想象一下,變量名稱用作sizeof的參數,然后更改。 在最好的情況下,重構重命名操作會更改所有實例,並且不會引入錯誤。 在最壞的情況下,錯過了sizeof的實例,編譯器會抱怨並修復它。 如果類型已更改,則表示已完成,sizeof語句不會出錯。

現在假設類型是sizeof的參數。 如果更改了變量的類型,則除了檢查之外沒有其他方法可以找到與該變量相關的所有sizeof。 您可以搜索,但是您將獲得相同類型sizeof的所有不相關用途的匹配。 如果錯過了一個,由於尺寸不匹配會導致運行時問題,這樣找不到更多麻煩。

除了Steve所說的,讓我補充一點,sizeof不會評估它的操作數。 所以你可以自由地做任何事情。 您不僅可以使用尚未初始化的變量,而且可以取消引用空指針,調用未定義但僅聲明的函數,並執行任何其他類型的操作。 我鼓勵你總是使用表達式版本,因為史蒂夫解釋得非常好。

還要考慮有時類型名稱很長且不可讀,只需考慮指向函數的指針(特別是在C ++中)。 而不是寫sizeof(my_long_type<weird, stuff>)你只需要做sizeof t

你可能會發現這些之間沒什么區別:

foo **ff = malloc(count * sizeof *ff);
foo **gg = malloc(sizeof(foo*) * count);

..但如果分配不在宣言附近怎么辦? 如果我遇到如下行:

ff = realloc(ff, count * sizeof *ff);

然后我有理由相信這條線是正確的,甚至沒有記住ff的類型。 但是,如果我看到這個:

ff = realloc(ff, count * sizeof(foo *));

然后我可能會有點懷疑,需要查看ff的類型讓我放松心情。

線f和ff肯定比g和gg差。 sizeof f是指針大小,因為f是一個點。 為了使它們等效,你必須寫sizeof *f (或者,為了更好的易讀性, sizeof(*f) )。

我傾向於在內存分配中使用sizeof(type) ,但在使用本地或全局變量時總是使用sizeof(variable) 盡管如此,建議中始終存在使用變量名稱的智慧。

我也進行了長時間的討論(有時是動畫,並且持續了一段時間 - 我們最終同意在這個問題上有所不同)關於是否可以使用sizeof(variable)或者它是否必須是sizeof variable ; 也就是說,括號是否將參數括在sizeof是否重要。 我從來沒有遇到一個編譯器,威特斯有關sizeof(variable) ,所以我選擇的均勻性,並且總是用括號sizeof 我的同事同樣堅持認為,括號不得與變量一起使用; 在某種程度上,有和沒有括號的符號之間存在着有價值的區別。 我沒有被說服 - 我不希望被說服。

在一個完全不同的方面,關於sizeof的其他幾點:

  • 如果您正在使用C99和VLA - 可變長度數組 - 那么sizeof(vla)不是編譯時常量。 謹防!
  • C預處理器不理解sizeof ,這是一個令人討厭但是合乎邏輯的。

業務邏輯定義了您的選擇。

  1. 如果你的代碼引用了一個特定的變量而沒有這個變量你的代碼沒有意義 - 選擇sizeof(var)

  2. 如果您使用特定類型對一組變量進行代碼處理 - 請選擇sizeof(type) 通常你需要這個,如果你有一個typedef定義了許多變量,你根據它們的類型(例如序列化)進行不同的處理。 您可能不知道在將來的代碼版本中將保留哪些變量,因此選擇type作為參數在邏輯上是正確的。 即使更改此類typedef也不會影響您的行sizeof

取一個變量的大小可能會產生意想不到的結果。 當變量是數組時,sizeof(array)將返回數組的大小,而不是單個元素的大小或指針的大小。 獲取指針的大小將返回指針的大小。 但由於數組通常在傳遞時表示為指針,因此事情會變得混亂。

暫無
暫無

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

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