簡體   English   中英

C為什么指針大於整數

[英]C why would a pointer be larger than an integer

我正在Linux機器上玩GCC中的sizeof(),我發現了一些非常令人驚訝的東西。

printf ("\nsize of int = %lu\n", sizeof(int));
printf ("\nsize of int* = %lu\n", sizeof(int *));

產量

size of int = 4
size of int* = 8

我認為指向整數的指針的大小會比實際的整數本身小得多!

我現在正在研究嵌入式軟件,我理解通過引用傳遞比傳遞值更有效(在功率方面)。

如果指針的大小大於實際值,有人可以澄清為什么通過引用傳遞比通過值更有效

謝謝!

整數可以是編譯器編寫者喜歡的任何大小,唯一的規則(在標准C中)是:a) int不小於short或大於long,b) int至少有16位。

在64位平台上將int保持為32位以實現兼容性並不罕見。

當要傳遞的值大於引用的大小時,通過引用傳遞比傳遞值更有效。 如果傳遞的是大型結構/對象,則通過引用傳遞很有意義。 如果要對值進行持久修改,則傳遞引用也是有意義的。

通過引用傳遞更有效,因為不需要復制數據(指針除外)。 這意味着當傳遞具有許多字段或結構的類或任何其他大於所用系統上的指針的數據時,這只會更有效。

在你提到的情況下,不使用指針確實更有效,因為實際值小於指向它的指針(至少在你使用的機器上)。 請記住,在3​​2位機器上,指針有4個字節(4 * 8 = 32位),而在64位機器上,你顯然使用指針有8個字節(8 * 8 = 64位)。

在更老的16位機器上,指針只需要2個字節,也許有些嵌入式系統仍在使用這種架構,但我不知道這個......

在C中,指針,任何指針,只是一個內存地址。 您使用的是64位計算機,而在硬件級別,內存地址使用64位值。 這就是為什么64位計算機可以使用比32位計算機更多的內存。

指向整數的指針可以指向一個整數,但同一指針也可以指向十,二十,一百或一百萬個整數。

顯然,傳遞單個8字節指針代替單個4字節整數並不是一個勝利; 但傳遞一個8字節指針代替一百萬個4字節整數肯定是。

有一件事與另一件事無關。 一個是地址,指向某個東西的指針,如果它是char或short或int或結構則無關緊要。 另一種是一種特定於語言的東西,稱為int,該系統的編譯器和該版本的編譯器以及命令行選項恰好定義為某種大小。

看起來好像是在64位系統上運行,因此所有指針/地址都將是64位。 他們指出的是一個單獨的討論,多頭也可能是64位,有時是整數,短路可能仍然是16位但不是硬/快規則和chars希望8位,但也不是硬/快規則。

這可能會變得更糟的是交叉編譯,而使用llvm-gcc,在cl​​ang之前就像現在一樣堅固。 對於64位主機,字節碼全部是基於64位主機生成的,所以64位整數,64位指針等等。然后當你為arm目標做后端時,它必須使用編譯器庫調用所有這一切64位工作。 這些變量幾乎不需要短缺,而是整數。 由於主機不是最終目標,-m32開關被打破,你仍然有64位整數。 gcc直接似乎沒有這個問題,clang + llvm目前也沒有這個問題。

簡短的回答是語言定義了一些數據類型char,short,int,long等,並且這些數據類型具有編譯器實現定義的大小。 和address只是另一種實現定義的數據類型。 這就像問為什么短的不一樣的字節數長? 因為它們是不同的數據類型,所以一個是短的,一個是長的。 一個是地址,另一個是變量,兩個不同的東西。

http://developers.sun.com/solaris/articles/ILP32toLP64Issues.html

將32位程序轉換為64位程序時,只有長類型和指針類型的大小從32位變為64位; int類型的整數大小保持在32位。

在64位可執行文件中,指針是64位。 長整數也是64位,但整數只有32位。

在32位可執行文件中,指針,int和long int都是32位。 32位可執行文件也支持64位“long long”整數。

指針必須能夠引用所有內存。 如果(虛擬)存儲器大於4 Gi字節,那么指針必須大於32位。

暫無
暫無

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

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