簡體   English   中英

使用最小的必要 C 類型與僅使用 int

[英]Using smallest necessary C type vs just using int

給定一個 C 函數(隨機示例):

void* getMyStuff( size_t size, unsigned char alignment );

使用unsigned char是通過告訴編譯器傳遞的值的限制來幫助編譯器,還是通過阻止編譯器使用本機int (或unsigned int )大小來阻礙編譯器?

我知道歷史上使用short並不理想,因為 16 位操作不是原生的。 我不知道這是否適用於這里(或一般的局部變量)。

基本上,如果您傳遞小於 32 位的值,這可能適合較小的數據類型,編譯器是否關心您選擇哪個?

作為參考,我正在使用 GCC 和 Clang,編譯 C11(不是 C++11)代碼。 這個問題可能是特定於 ABI 的,但我不知道如何確定。

編輯:如果重要的話,我正在 x86_64 上開發。 我希望答案不會因 CPU 供應商而異。

使用 unsigned char 是通過告訴編譯器傳遞的值的限制來幫助編譯器,還是通過阻止編譯器使用本機 int(或 unsigned int)大小來阻礙編譯器?

取決於 CPU 和 ABI。 最有效的方法完全取決於 ABI 記錄為最快的調用約定。

通常,高端 CPU 喜歡使用他們喜歡的數據寬度和對齊方式。 32 位用於 32 位 CPU 等等。 然而,它們可能支持對較小類型的操作。 低端 CPU(8 位或 16 位)根本不喜歡更大的類型,如果可能,通常更喜歡使用 8 位類型。

我知道歷史上使用 short 並不理想,因為 16 位操作不是原生的。

不是本地人在哪里 16 位操作在所有 16 位 CPU 上都是完美的“本機”。 它們可能不適用於某些 32 位數據,對 16 位數據的指令支持較差。

基本上,如果您傳遞小於 32 位的值,這可能適合較小的數據類型,編譯器是否關心您選擇哪個?

通常不允許編譯器將您選擇的類型替換為更大的類型,因為這可能會改變程序的含義和行為。 除了uint_fast8_t和類似的現代類型之外,如果編譯器會導致更快的代碼,則允許編譯器交換更大的類型。

作為參考,我正在使用 GCC 和 Clang

編譯器無所謂。 只有特定的目標端口及其 ABI 很重要。 雖然在一些低端 CPU 上,如專用微控制器,但通常沒有標准化的 ABI,因此每個編譯器都為該目標發明了自己的 ABI/調用約定。

正如@WeatherVane 在評論中所說,簡單的答案是:

除非有很好的理由不使用int否則請使用int

我不會用一堆痛苦的重復論點來延長這個答案:一切都已經說過很多次了。 如果您使用charshort作為參數類型,通常不會出錯,但實際上,也沒有任何好處。 你可能會花更多的時間來擔心它,而不是用任何其他方式來彌補。

正如安德魯在評論中提醒我的那樣, intunsigned int之間的選擇重要; 我並不是要建議忽略這種區別。

暫無
暫無

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

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