为什么Linux内核通常在无符号长对象中保存指针

问题描述

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

在Linux用户空间应用程序中将指针保留在unsigned long中而不是uintptr_t中可移植吗? (尽管我知道uintptr_t保证可以从void *转换为uintptr整数并返回,而不会丢失信息)

谢谢。

解决方法

在Linux用户空间应用程序中将指针保留在unsigned long中而不是uintptr_t中可移植吗? (尽管我知道uintptr_t保证可以从void *转换为uintptr整数并返回,而不会丢失信息)

“是”,它可以在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上仅 不够宽,无法容纳指针。