2012-02-13 72 views
1

我想在不依賴於平臺的gcc中定義一個大尺寸指針(64位或128位)。 我想在MSDN中有類似__ptr128或__ptr64的東西。gcc中的大尺寸指針

sizeof(__ptr128) is 16 bytes. 
sizeof(__ptr64) is 8 bytes. 

是否有可能?

當您在64位操作系統中使用內核函數時需要8個字節的指針參數,並且您有一個使用32位地址的32位應用程序,並且您希望使用此內核函數,這會很有用。

+3

你到底要如何使用比地址空間大的指針? – user57368 2012-02-13 14:49:34

+0

正如@adelphus在[回答下面](http://stackoverflow.com/a/9262508/180174)中所述,平臺無關的指針大小定義沒有意義。也就是說,GCC 4中有一個用於128位整數的「__int128」類型。6(但不是更舊) – Kimvais 2012-02-13 14:56:29

+0

我告訴__ptr128而不是__int128 – 2012-02-13 14:57:58

回答

7

你的問題沒有意義。按照定義,指針是一種內存地址 - 大小必須取決於平臺。如何在支持64位尋址的硬件平臺上取消引用128位指針?

您可以創建64或128位,但指針與底層硬件的內存尋址方案直接相關。

編輯

有了您的附加說明,我想我看到你想要做什麼。不幸的是,我懷疑這是可能的。如果你想使用的內核函數需要一個64位的指針參數,那麼它很可能是一個64位函數(除非你正在開發一些不尋常的硬件)。

儘管技術上它是可能將64位指令混合到32位可執行文件中,但編譯器實際上不會讓您這樣做。 64位API調用將使用64位代碼,64位寄存器和64位堆棧 - 編譯器和操作系統管理從32位環境到64位的任意切換將會非常尷尬環境。

你應該看看爲32位環境找到等效的API。也許你可以發佈你想使用的內核函數原型(名稱+參數),並且有人可以幫助你找到更好的解決方案。

只是所以沒有混亂,__ptr64在MSDN獨立平臺:

在32位系統,具有__ptr64聲明的指針被截斷爲 32位指針。

+0

當在64位操作系統中使用內核函數時需要8字節指針參數,並且你有一個使用32位地址的32位應用程序,並且你想使用它內核功能。 – 2012-02-13 15:01:56

+1

所以你想要的是32/64位指針,而不是128位指針。無論如何,這只是一個64位的指針(32位上半部分爲零)。或者,只要一個pointer_,因爲在32位系統上,你不可能有一個64位指針,這個指針並不完全是假的,而在64位系統上,指針在任何情況下都已經是64位。這使得整個努力有點荒謬的開始。或者,如果您對結構填充/對齊偏執,則可能需要將「void *」和「uint64_t」封裝到具有適當轉換運算符的聯合中。 – Damon 2012-02-13 16:39:28

+0

是的!我想是這樣。但是如果有更多的細節和例子,我喜歡! – 2012-02-13 16:43:28

0

無法評論,但在「32位可執行文件」中無法使用64位指令的說法具有誤導性,因爲「32位可執行文件」的定義有待解釋。如果你的意思是一個使用32位指針的可執行文件,那麼根本沒有什麼說你不能在使用32位指針時使用操縱64位值的指令。處理器不知道差異。

Linux甚至支持可以有32位用戶空間和64位內核空間的模式。因此,每個應用程序都可以訪問4GB的RAM,但系統可以訪問更多。這將指針的大小保持爲4字節,但不限制使用64位數據操作。