intptr_t详解

来源:互联网 发布:淘宝外包客服工资 编辑:程序博客网 时间:2024/06/14 18:38

看leveldb代码时候发现inptr_t居然不知道是啥,搜索了一番发现一个比较官方的解释:

尽管大部分程序员习惯自由使用标准类型, 如 int 和 long, 编写设备驱动需要一些小心来避免类型冲突和模糊的 bug.

这个问题是你不能使用标准类型, 当你需要"一个 2-字节 填充者"或者"一个东西来代表一个4-字节 字串", 因为正常的 C 数据类型在所有体系上不是相同大小. 为展示各种 C 类型的数据大小, datasize 程序已包含在例子文件 misc-progs 目录中, 由 O' Reilly's FTP 站点提供. 这是一个程序的样例运行, 在一个 i386 系统上(显示的最后 4 个类型在下一章介绍):

morgana% misc-progs/datasizearch Size: char short int long ptr long-long u8 u16 u32 u64i686       1    2     4   4    4   8         1  2   4   8

这个程序可以用来显示长整型和指针在 64-位 平台上的不同大小, 如同在不同 Linux 计算机上运行程序所演示的:

arch  Size:  char  short  int  long  ptr long-long  u8 u16 u32 u64 i386         1     2      4    4     4   8          1  2   4   8  alpha        1     2      4    8     8   8          1  2   4   8  armv4l       1     2      4    4     4   8          1  2   4   8  ia64         1     2      4    8     8   8          1  2   4   8  m68k         1     2      4    4     4   8          1  2   4   8  mips         1     2      4    4     4   8          1  2   4   8  ppc          1     2      4    4     4   8          1  2   4   8  sparc        1     2      4    4     4   8          1  2   4   8  sparc64      1     2      4    4     4   8          1  2   4   8  x86_64       1     2      4    8     8   8          1  2   4   8  

注意有趣的是 SPARC 64 体系在一个 32-位 用户空间运行, 因此那里指针是 32 位宽, 尽管它们在内核空间是 64 位宽. 这可用加载 kdatasize 模块(在例子文件的 misc-modules 目录里)来验证. 这个模块在加载时使用 printk 来报告大小信息, 并且返回一个错误( 因此没有必要卸载它 ):

kernel: arch Size: char short int long ptr long-long u8 u16 u32 u64kernel: sparc64    1    2     4   8    8   8         1  2   4   8
尽管在混合不同数据类型时你必须小心, 有时有很好的理由这样做. 一种情况是因为内存存取, 与内核相关时是特殊的. 概念上, 尽管地址是指针, 内存管理常常使用一个无符号的整数类型更好地完成; 内核对待物理内存如同一个大数组, 并且内存地址只是一个数组索引. 进一步地, 一个指针容易解引用; 当直接处理内存存取时, 你几乎从不想以这种方式解引用. 使用一个整数类型避免了这种解引用, 因此避免了 bug. 因此, 内核中通常的内存地址常常是 unsigned long, 利用了指针和长整型一直是相同大小的这个事实, 至少在 Linux 目前支持的所有平台上.

因为其所值的原因, C99 标准定义了 intptr_t 和 uintptr_t 类型给一个可以持有一个指针值的整型变量. 但是, 这些类型几乎没在 2.6 内核中使用.

总而言之就是:intptr_t是为了跨平台,其长度总是所在平台的位数,所以用来存放地址。

参考:http://www.cnblogs.com/Anker/p/3438480.html

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* There is some amount of overlap with <sys/types.h> as known by inet code */  
  2. #ifndef __int8_t_defined  
  3. # define __int8_t_defined  
  4. typedef signed char         int8_t;  
  5. typedef short int          int16_t;  
  6. typedef int               int32_t;  
  7. # if __WORDSIZE == 64  
  8. typedef long int          int64_t;  
  9. # else  
  10. __extension__  
  11. typedef long long int        int64_t;  
  12. # endif  
  13. #endif  
  14.   
  15. /* Unsigned.  */  
  16. typedef unsigned char         uint8_t;  
  17. typedef unsigned short int    uint16_t;  
  18. #ifndef __uint32_t_defined  
  19. typedef unsigned int          uint32_t;  
  20. # define __uint32_t_defined  
  21. #endif  
  22. #if __WORDSIZE == 64  
  23. typedef unsigned long int       uint64_t;  
  24. #else  
  25. __extension__  
  26. typedef unsigned long long int    uint64_t;  
  27. #endif  

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* Types for `void *' pointers.  */  
  2. #if __WORDSIZE == 64  
  3. # ifndef __intptr_t_defined  
  4. typedef long int               intptr_t;  
  5. #  define __intptr_t_defined  
  6. # endif  
  7. typedef unsigned long int    uintptr_t;  
  8. #else  
  9. # ifndef __intptr_t_defined  
  10. typedef int                    intptr_t;  
  11. #  define __intptr_t_defined  
  12. # endif  
  13. typedef unsigned int        uintptr_t;  
  14. #endif  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 迅雷登录太频繁怎么办 糖果手机声音小怎么办 产品出现了问题怎么办 插头螺丝太紧怎么办 宜家儿童乐园怎么办卡 泰国旅游有蚊子怎么办 啦泰国旅游拉肚子怎么办 电动车上不了牌怎么办 电动车电压低了怎么办 电车显示器不亮怎么办 电动车故障显示m怎么办 电动车上面出现m怎么办 佰仟乐购额度没有了怎么办 交易密码忘记了怎么办? 电脑打开没网怎么办 网络配适器无法运行怎么办 电脑dns没有响应怎么办 win7系统没有网上邻居怎么办 win10网络重置了怎么办 win7桌面没有网上邻居怎么办 win7电脑没有网上邻居怎么办 无线网连接受限怎么办 win7账户被锁定怎么办 贷款sdk授权失败怎么办 京东保价发票怎么办 淘宝购物出现质量问题怎么办 淘宝购物降价了怎么办 淘宝购物物流慢怎么办 在淘宝购物退货怎么办 淘宝购物未付款怎么办 淘宝购物余额不足怎么办 淘宝购物漏发货怎么办 京东618无货怎么办 iis默认文档无效怎么办? 购物卡没有磁性怎么办 墙面贴纸没有贴怎么办 车显示电池符号怎么办 遇上北京购物团怎么办 钱柜老是钱不见怎么办 写真顾客退单怎么办 电视不支持投屏怎么办