簡體   English   中英

指針的大小是多少? 它究竟依賴於什么?

[英]What is the size of a pointer? What exactly does it depend on?

我在網上搜索,雖然我可以找到一些討論,但我沒有找到全面的描述。 因此,如果任何人都可以形成一個涵蓋指針大小的答案,那將會有很大的幫助。 答案至少應包括以下主題

  1. 指針的大小取決於什么?
  2. 架構的哪些特性會影響指針的大小? (詳細)
  3. 編譯器如何影響指針的大小?

指針是由高級語言提供的抽象; 理論上它可以是任何寬度。 這完全是編譯器的一時興起。

實際上,它通常與底層硬件的內存地址的寬度有關,因為這通常是編譯器實現的最有效的方法。 但也有例外; 例如,C ++的指向成員函數的指針沒有直接映射到硬件地址,因為它需要表示兩個實體(函數和類型的一些概念)。

然而,即使把它放在一邊,仍然存在復雜性。 例如:

  • 在大多數現代硬件上,您的程序將使用虛擬內存地址,而不是物理地址(可能不是相同的寬度)。 除非您正在編寫內核空間代碼。
  • 在某些體系結構(例如x86)上,底層硬件展示了分段地址空間。 這非常復雜,但主要是由操作系統和虛擬內存系統抽象出來的。 如果您正在為非常老的x86編寫內核空間代碼或代碼,那么您將不得不處理它。
  • 在當前的x86-64上,(虛擬)內存地址實際上只有48位寬。
  • x86-64支持32位和64位可執行文件。
  • 您可能正在虛擬機內運行,如果需要,它也可以執行任何操作(相對於底層物理機)。

這個問題最初標記為C和C ++,而不是“語言不可知”。 作為一個與語言無關的問題,它應該被視為過於寬泛 ,但我希望OP將其恢復為原始版本1,因此我不投票結束。 作為一個C / C ++問題,雖然它顯然是負責任的,但它被視為過於寬泛,然后當范圍被極大地擴展到無法回答時,通過將該標記更改為與語言無關,它被重新打開為現在可以回答。

我正在回答C ++的原始問題,在這里和那里散布了一些C知識。

我認為目前的“語言不可知”問題是無法回答的,盡管有一種嘗試與語言無關的答案。

1.指針的大小取決於什么?

普通數據指針所需的最小尺寸取決於指向類型或不同功能的對象的可能存儲位置的最大數量; 為了區分n個可能的位置,需要ceil(lg2( n ))位。

因此,最小指針大小取決於最大可能的內存大小。

因此,最小指針大小也取決於指向類型的對齊。 在某些現在過時機,並且甚至可能在某些現存機器(主機?),存儲器的硬件水平可尋址單元是一個例如2或4個字節的。 然后可以使用小指針來尋址字對齊的數據,而char*因此也需要更大的void*

因此,§3.9.2/ 4中的C ++ 11標准要求“類型為cv void*的對象應具有與cv char*相同的表示和對齊要求。”

C ++中的成員函數指針更類似於偏移而不是指針,並且通常比正確的指針更大。


2.架構的哪些特性會影響指針的大小? (詳細)

從C ++可以看出主要是可記錄的內存范圍。

但是值得回顧的是,在MS-DOS編程中,一個區分了指針和指針。 指針是一個隱含的64K內存段的偏移量,而一個兩倍大小的指針組合了一個段選擇器和偏移量。

在(仍)現代32位PC編程中,C和C ++指針通常類似於指針,不支持指針,即6個字節。 要使用這樣的指針,必須使用匯編語言等其他語言。


3.編譯器是否會影響指針的大小? 怎么樣?

使用的編譯器和編譯選項原則上可以影響指針大小,因為標准沒有規定大小。 例如,它原則上可以添加信息以幫助調試。 或者如上所述,使用語言擴展可以有近距離遠距離指針。

由於成員指針不是直接地址(在引擎蓋下),因此編譯器如何表示它們以及它們有多大。

這也取決於使用的選項。


4.有哪些不同類型的指針以及它們如何彼此不同? (例如:函數指針和指向基本數據類型的指針之間是否有區別?指針與遠指針等附近)

在C ++ 03中,函數指針無法轉換為數據指針,反之亦然。 這種限制支持具有哈佛架構的機器,並且它支持可能的不同大小的函數指針和數據指針(例如,前者為 ,后者為 )。 在C ++ 11中, 有條件地支持這種轉換,在§5.2.10/ 8中,由缺陷報告195產生

值得注意的是,Posix標准需要支持轉換(函數指針)→( void* )和返回,例如對於dlsym函數。

上述有效意味着對象指針和函數指針是不同的。 例如,后者不支持地址算術。 此外,成員指針與正確的指針不同,更類似於偏移。

Modern C ++不支持near指針和遠指針。


5.語言是否對指針有影響。 C vs C ++

C不支持成員指針,在這個問題中它們被認為是指針。

除此之外,C ++的主要目標是能夠直接使用C庫,並將C標准“合並”(C ++11§17.5.1.5/ 1)到C ++標准中,這需要兼容的指針表示。

C支持限制指針,限定符restrict ,C ++不支持。 但是,這只會影響編譯器對指針可能值的了解。 這意味着C編譯器可能能夠發出更好的優化代碼。

暫無
暫無

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

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