[英]What does 'Natural Size' really mean in C++?
我知道'自然大小'是特定硬件最有效處理的整數寬度。 在數組或算術運算中使用short
時,必須首先將short
整數轉換為int
。
問:究竟是什么決定了這種“自然尺寸”?
我不是在尋找簡單的答案
如果它具有32位架構,則其自然大小為32位
我想了解為什么這是最有效的,以及為什么必須在對它進行算術運算之前轉換short
。
獎金問:當對long
整數進行算術運算時會發生什么?
一般而言,每個計算機體系結構被設計成使得某些類型大小提供最有效的數值運算。 具體大小取決於體系結構,編譯器將選擇合適的大小。 關於為什么硬件設計者為特定硬件選擇某些尺寸的更詳細解釋將超出stckoverflow的范圍。
在執行整數運算之前, short
時間被提升為int
,因為這就是它在C中的方式,並且C ++在沒有或沒有理由改變它的情況下繼承了該行為,可能破壞了現有代碼。 我不確定它最初是在C中添加的原因,但可以推測它與“default int”相關,其中如果沒有指定類型int
則由編譯器承擔。
獎勵A:從5/9(表達式)我們學習: Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:
然后特別感興趣:
Otherwise, the integral promotions (4.5) shall be performed on both operands
Then, if either operand is unsigned long the other shall be converted to unsigned long.
Otherwise, if one operand is a long int and the other unsigned int, then if a long int can represent all the values of an unsigned int, the unsigned int shall be converted to a long int; otherwise both operands shall be converted to unsigned long int.
Otherwise, if either operand is long, the other shall be converted to long.
總之,編譯器嘗試使用它可以執行二進制操作的“最佳”類型,其中int
是使用的最小大小。
'自然大小'是特定硬件最有效處理的整數寬度。
並不是的。 考慮x64架構。 從8到64位的任何大小的算術將基本上是相同的速度。 那么為什么所有x64編譯器都支持32位int
呢? 好吧,因為那里有很多代碼,最初是為32位處理器編寫的,而且很多代碼都隱含地依賴於32位的內存。 並且鑒於一種類型的近無用性可以表示高達九個數值的值,每個整數的額外四個字節實際上將是未使用的。 因此,我們已經確定32位整數對於這個64位平台來說是“自然的”。
比較80286架構。 寄存器中只有16位。 在這樣的平台上執行32位整數加法基本上需要將其分成兩個16位加法。 用它做任何事都涉及將它分開,真的 - 以及隨之而來的減速。 80286的“自然整數大小”絕對不是 32位。
實際上,“自然”歸結為處理效率,內存使用和程序友好等因素。 這不是酸性測試。 這是架構/編譯器設計者的主觀判斷問題。
究竟是什么決定了這種“自然尺寸”?
對於某些處理器(例如32位ARM和大多數DSP型處理器),它由架構決定; 處理器寄存器是特定大小,並且算術只能在該大小的值上進行。
其他(例如Intel x64)更靈活,並且沒有單一的“自然”尺寸; 編譯器設計人員可以選擇大小,效率,值范圍和內存使用之間的折衷。
為什么這是最有效的
如果處理器要求值為算術的特定大小,則選擇其他大小將強制您將值轉換為所需大小 - 可能需要花費。
為什么在對它進行算術運算之前必須轉換short
據推測,在半個世紀前開發C時,這與常用處理器的行為非常匹配。 C ++繼承了C語言的推廣規則。我無法真正評論為什么它被認為是一個好主意,因為我當時並非出生。
算術運算是在
long
整數上進行的,會發生什么?
如果處理器寄存器足夠大以容納long
,那么算法將與int
非常相似。 否則,必須將操作分解為在多個寄存器之間分配的值的若干操作。
我知道'自然大小'是特定硬件最有效處理的整數寬度。
這是一個很好的開始。
問:究竟是什么決定了這種“自然尺寸”?
上面的段落是“自然尺寸”的定義。 沒有別的決定它。
我想了解為什么這是最有效的
根據定義。
以及為什么必須在對其進行算術運算之前轉換short。
之所以如此,是因為C語言的定義如此。 沒有深層的架構原因(當C被發明時可能會有一些原因)。
獎金問:當對長整數進行算術運算時會發生什么?
一堆電子沖過骯臟的沙子,遇到一堆洞。 (不,真的。問一個模糊的問題......)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.