为什么 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
不够宽,无法容纳指针。
我经常看到(例如在 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 inuintptr_t
in Linux user space applications? (Although I know thatuintptr_t
guarantees to convert fromvoid *
touintptr
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
不够宽,无法容纳指针。