为什么 linux 内核(经常)在无符号长对象中保存指针

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

我经常看到(例如在 Linux 内核中)unsigned long 用于保存指针。我想知道这是什么原因,因为指针的大小可能大于整数类型(包括 long)。

在 Linux 用户 space 应用程序中将指针保存在 unsigned long 而不是 uintptr_t 中是否可移植? (虽然我知道 uintptr_t 保证从 void * 转换为 uintptr 整数并返回而不会丢失信息)

谢谢。

Is it portable to keep a pointer in unsigned long rather than in uintptr_t in Linux user space applications? (Although I know that uintptr_t guarantees to convert from void * to uintptr integer and back without loss of information)

“是”的意思是它可以在 Linux 的任何当前端口上工作,并且很可能在将来工作。但为什么?有一个非常好的 typedef 也指定了意图:uintptr_t - 它也使您的代码可移植到 Win64。

uintptr_t 是 C99 的发明,Linux 比 C99 早了几年。那时没有指定一个足够宽的整数来容纳指针的约定——但是那时也没有 unsigned long long ,除了编译器扩展,所以 unsigned long 是你可以合理期望持有的所有内容一个指针,如果有的话,它就是这样。到目前为止,对于任何运行 Linux 的新架构来说,都需要为 long 选择类型,以便它足够宽以容纳指针 size_t

当 64 位 Windows 出现时,太多 东西依赖于 unsigned long 的某种表示,它仍然是 32 位而不是保存指针所需的类型。据我所知,目前所有相关平台 只有 在 Win64 上 unsigned long 不够宽,无法容纳指针。