簡體   English   中英

int的大小是否取決於編譯器和/或處理器?

[英]Does the size of an int depend on the compiler and/or processor?

整數的大小取決於編譯器,操作系統和處理器嗎?

這個問題的答案取決於我們願意得到多大的實際考慮。

最終,從理論上講,C和C ++中的所有內容都取決於編譯器,並且僅取決於編譯器。 硬件/操作系統根本不重要。 編譯器可以自由實現任何厚度的硬件抽象層,並且可以完全模擬任何東西。 沒有什么可以阻止C或C ++實現實現任何大小和任何表示形式的int類型的,只要它足夠大以符合語言標准中指定的最低要求即可。 這樣的抽象水平的實際例子是容易獲得的,例如基於諸如Java的“虛擬機”平台的編程語言。

但是,C和C ++旨在成為高效的語言。 為了獲得最大效率,C或C ++實現必須考慮從底層硬件派生的某些注意事項。 因此,確保每種基本類型都直接(或幾乎直接)基於硬件支持的某種表示形式非常有意義。 從這個意義上說,基本類型的大小確實取決於硬件。

換句話說,針對64位硬件/ OS平台的特定C或C ++實現完全可以自由地將int作為71位1的補碼有符號整數類型來實現,該類型占用128位內存,而將其他57位用作填充存儲編譯器作者女友生日的必需位。 該實現甚至將具有一定的實用價值:它可用於執行C / C ++程序可移植性的運行時測試。 但這就是該實現的實際用處將要結束的地方。 不要指望在“正常”的C / C ++編譯器中看到類似的東西。

是的,它取決於處理器(更具體地說,是ISA,指令集體系結構,例如x86和x86-64)以及包括編程模型在內的編譯器。 例如,在16位計算機中,sizeof(int)為2個字節。 32位計算機的int有4個字節。 它一直被認為int是一個處理器的本大小,即寄存器的大小。 但是,32位計算機如此流行,並且已經為32位編程模型編寫了大量軟件。 因此,如果64位計算機將8個字節用於int ,將非常令人困惑。 Linux和Windows都為int保留4個字節。 但是,他們中的大小不同long

請看一下大多數* nix和Windows的LLP64之類的64位編程模型,例如LP64

當您編寫在Window和Linux上都可以使用的代碼時,這樣的差異實際上非常令人尷尬。 因此,我一直通過stdint.h使用int32_tint64_t ,而不是long

是的,會的。 他們的意思是“取決於哪個:編譯器或處理器”? 在那種情況下,答案基本上是“兩者”。 通常, int不會大於處理器寄存器(除非小於16位),但是可能會較小(例如,在64位處理器上運行的32位編譯器)。 但是,通常,您需要使用64位處理器來運行具有64位int的代碼。

根據最近的一些研究,我已經完成了固件訪問的研究:

處理器位架構(即8位,16位,32位,64位)最重要的影響是您需要如何最有效地存儲信息的每個字節,以便在最少的周期數內最佳地計算變量。

處理器的位大小告訴您CPU在一個周期內可以處理的自然字長。 如果32位計算機在內存中正確對齊,則需要2個周期來處理64位double。 大多數個人計算機過去都是,現在仍然是32位,因此C編譯器對32位整數的典型親和力以及更大的浮點數和長整型的選項是最可能的原因。

顯然,您可以計算較大的變量大小,因此從某種意義上說,CPU的位體系結構決定了如何存儲較大和較小的變量才能實現最佳的處理效率,但這絕不是字節大小定義的限制因素對於整數或字符,這是編譯器的一部分,由慣例或標准規定。

我發現該站點對http://www.geeksforgeeks.org/archives/9705非常有幫助,可以解釋CPU的自然字長如何影響它將如何選擇存儲和處理更大或更小的變量類型,尤其是在位打包方面變成結構。 您必須非常了解如何選擇分配變量,因為較大的變量需要在內存中對齊,因此除以CPU的字長后,它們占用的循環次數最少。 如果您對變量的分配順序不正確,則會為諸如struct之類的東西增加很多潛在的不必要的緩沖區/空白空間。

簡單而正確的答案是,它取決於編譯器。 這並不意味着架構無關緊要,但是編譯器會處理該問題,而不是您的應用程序。 您可以更准確地說,它取決於編譯器的(目標)體系結構,例如,是32位還是64位。

考慮您有一個Windows應用程序,該應用程序會創建一個文件,在其中寫入int以及其他內容,然后將其讀回。 如果在32位和64位窗口上都運行此命令會發生什么? 如果復制在32位系統上創建的文件並在64位系統上打開文件,會發生什么情況?

您可能會認為int的大小在每個文件中會有所不同,但是沒有,它們將是相同的,這就是問題的症結所在。 您選擇編譯器中的設置以目標為32位或64位體系結構,這決定了一切。

數據類型的大小取決於處理器,因為編譯器希望使CPU更容易訪問下一個字節。 例如:如果處理器為32位,則編譯器可能不會選擇int大小作為2個字節(應該選擇4個字節),因為訪問該int的另外2個字節(4個字節)將占用額外的CPU周期,這是浪費的。 如果編譯器選擇int作為4字節,則CPU可以一次性完成4字節的訪問,從而加快了應用程序的速度。

謝謝

數據類型的大小基本上取決於編譯器的類型,並且編譯器是根據處理器的體系結構設計的,因此外部數據類型可以視為依賴於編譯器。例如,整數的大小在16位tc編譯器中為2字節,而在4字節時為4字節。在gcc編譯器中,盡管它們在同一處理器中執行

http://www.agner.org/optimize/calling_conventions.pdf

“ 3數據表示”很好地概述了編譯器對整數類型的處理方式。

int的大小等於取決於基礎ISA的字長。 處理器只是ISA的硬件實現,而編譯器只是ISA的軟件端實現。 一切都圍繞基礎ISA。 如今,最受歡迎的ISA是Intel的IA-32。 它的字長為32位或4字節。 4個字節可能是'int'編譯器的最大大小(只是普通int,不是短整數或長整數)。 基於IA-32,可以使用。

是的,我發現Turbo C中int的大小為2個字節,而在MSVC編譯器中,它的大小為4個字節。

基本上,int的大小是處理器寄存器的大小。

暫無
暫無

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

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