如果考虑应用程序的兼容性和可移植性,指针长度就是一个问题。在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,char
指针和结构体指针长度相同。尽管C标准没有规定所有数据类型的指针长度相同,但是通常实际情况就是这样。不过,函数指针长度可能与数据指针长度不同。
指针长度取决于使用的机器和编译器。比如,在现代Windows上,指针是32位或64位长。对于DOS和Windows 3.1来说,指针则是16位或32位长。
内存模型
64位机器的出现导致为不同数据类型分配的内存在长度上的差异变得明显。不同的机器和编译器在给C的基本数据类型分配空间上有不同的做法。用来描述不同数据模型的一种通用表示法总结如下:
I In L Ln LL LLn P Pn
每个大写字母对应整数、长整数或指针,小写字母表示为该数据类型分配的位数。表1-3总结了这些模型,其中数字表示位数。
表1-3:机器内存模型
C数据类型 | LP64 | ILP64 | LLP64 | ILP32 | LP32 |
---|---|---|---|---|---|
char |
8 | 8 | 8 | 8 | 8 |
short |
16 | 16 | 16 | 16 | 16 |
_int32 |
32 | ||||
int |
32 | 64 | 32 | 32 | 16 |
long |
64 | 64 | 32 | 32 | 32 |
long long |
64 | ||||
pointer |
64 | 64 | 64 | 32 | 32 |
模型取决于操作系统和编译器,一种操作系统可能支持多种模型,这通常是用编译器选项来控制的。
评论前必须登录!
注册