簡體   English   中英

為什么 linux kernel(經常)將指針保存在 unsigned long object 中

[英]why does linux kernel (often) hold pointer in unsigned long object

我經常看到(例如在 Linux kernel 中) unsigned long用於保存指針。 我想知道這是什么原因,因為指針的大小可能大於 integer 類型(包括 long)。

在 Linux 用戶空間應用程序中將指針保留在unsigned long而不是uintptr_t中是否可移植? (雖然我知道uintptr_t保證從void *轉換為uintptr integer 並返回而不會丟失信息)

謝謝。

在 Linux 用戶空間應用程序中將指針保留在unsigned long而不是uintptr_t中是否可移植? (雖然我知道uintptr_t保證從void *轉換為uintptr integer 並返回而不會丟失信息)

“是”的意思是它可以在 Linux 的任何當前端口上工作,而且很可能在未來工作。 但為什么? 有一個非常好的 typedef 也指定了意圖: uintptr_t - 它也使您的代碼可移植到 Win64。

uintptr_t是 C99 的發明,Linux 比 C99 早了幾年。 那時沒有指定 integer 寬度足以容納指針的約定 - 但是那時,也沒有unsigned long long ,除了編譯器擴展,所以unsigned long是你可以合理期望容納指針的全部,如果有的話確實如此。 到目前為止,對於任何運行 Linux 的新架構來說,都需要選擇long類型,以便它足夠寬以用於指針size_t等。

當 64 位 Windows 出現時,太多東西依賴於unsigned long的某種表示,它仍然是 32 位,而不是保存指針所需的類型。 據我所知,目前所有相關平台在 Win64 unsigned long上不夠寬,無法容納指針。

暫無
暫無

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

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