看leveldb代码时候发现inptr_t居然不知道是啥,搜索了一番发现一个比较官方的解释:
尽管大部分程序员习惯自由使用标准类型, 如 int 和 long, 编写设备驱动需要一些小心来避免类型冲突和模糊的 bug.
这个问题是你不能使用标准类型, 当你需要"一个 2-字节 填充者"或者"一个东西来代表一个4-字节 字串", 因为正常的 C 数据类型在所有体系上不是相同大小. 为展示各种 C 类型的数据大小, datasize 程序已包含在例子文件 misc-progs 目录中, 由 O' Reilly's FTP 站点提供. 这是一个程序的样例运行, 在一个 i386 系统上(显示的最后 4 个类型在下一章介绍):
morgana% misc-progs/datasize
arch Size: char short int long ptr long-long u8 u16 u32 u64
i686 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 u64
kernel: 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
/* There is some amount of overlap with <sys/types.h> as known by inet code */
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
# endif
#endif
/* Unsigned. */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
A/D200W多用应急电源
比亚迪推出超级充电电动汽车技术
弗罗斯特沙利文:2025年推动全球汽车市场的主要趋势
具有过压保护的低压5A/12V直流电源
GA7230L型光接收机开关电源电路
BD200W应急电源
PHILIPS公司32位FLASH MCU的优势 (来自ARM公司)
MSP430 汇编程序设计 (二)
[转载] 张艾嘉 刘若英 李心洁 你最喜欢哪种类型?
想不到從洗澡上也可看出一個人的個性,很妙吧!!
基于Microchip ISELED的汽车内部照明参考设计
英伟达推出开源推理软件Dynamo 为AI工厂降本增效
TrendForce:加速美国及欧洲EV固态电池验证 预计2026年将逐步开始量产
认证FTP重新开放
AEP-P200全自动停电应急电源
PHILIPS发布业内最快的32位ARM微处理器
PHILIPS单色LCD驱动器COG模块设计指南
车载48V至12V电源转换参考设计
好消息:风河的培训中心开张了。
MSP430 学习套件(三)
一线专家剖析人形机器人技术难点!!!
MSP430 学习套件(一)
PHILIPS公司80C51系列单片机与众不同的4大特点是什么?
哪吒汽车否认“解散研发团队”等不实传闻
PHILIPS单片机的现状及其发展趋势
用于800V牵引逆变器的45W辅助电源参考设计
MSP430 汇编程序设计 (三)
MSP430 学习套件(二)
一句话把人逗乐的经典!
基于SAM L22的可穿戴心电图参考设计