C++中int/long/pointer长度

来源:互联网 发布:vb replace函数用法 编辑:程序博客网 时间:2024/05/17 02:18

0x00 信仰

很久很久以前,在一个记不清的地方,一个记不清的地方看过一句曾经然我奉为圣经的话:~不论32还是64位平台,C++中指针的长度始终与long类型长度一致~
那些年,也曾单纯,那些年也曾懵懂。最近又看到这个话题,于是写这篇博客,科学的说明也许你坚信的信仰最终只是谎言~

0x01 现实

伟大领袖邓小平说过:实践是检验真理的唯一标准。
在Windows 64位系统下编译运行如下代码

#include <iostream>int main(int argc, char *argv[]){    cout<<"size of long:"<<sizeof(long)<<endl;    cout<<"size of int*:"<<sizeof(int*)<<endl;}

输出结果:

size of long:8size of int*:4

0x02 宇宙真理

其实,上面信仰不对,但是也不全错,int/long/potinter的具体长度在c++标准中并没有准确定义,c++标准只说了long不小于int,于是各个系统在设计的时候就有了格子的标准。

  • 数据模型
Data Type ILP32 ILP64 LP32 LP64 LLP64 char 8 8 8 8 8 short 16 16 16 16 16 int 32 64 16 32 32 long 32 64 32 64 32 long long 64 64 64 64 64 pointer 32 64 32 64 64

现在常见的系统大致就可以分为ILP32, ILP64, LP64, LLP64四种字长数据模型。
I即表示int,L表示long,P表示Pointer,LL表示long long。

ILP32即int, long, pointer的数据长度都是32位;
ILP64即int, long, pointer的数据长度都是64位;
LP64即long, pointer的数据长度都是64位;
LLP64即long long, pointer的数据长度都是64位。

  • 辨证
    由上可以看出,除了LLP64模型的系统,其他系统模型通常都设定long和pointer长度相同。

  • 透过本质看现象
    常见的系统中,windows32/linux32/unix32都采用ILP32模型,windows64采用LLP64,linux64位采用LP64。也就是说区别就在于64位系统中。

0x03 垮平台代码中存储指针

有时候代码中不得不将某一类型指针对象保存出来以方便传递到别处处理,在32位平台中通常会将指针保存为int,在linux64中尝尝看见大家保存为long,而在win64中我们必须将指针保存为long long类型才行。
但在跨平台编码中,其实我们只需要保证存储pointer的数据类型长度大于pointer长度即可。
比如所有平台中都使用long long 或者int64_t之类的类型来存储指针可以大大提高代码的可移植性。

0 0
原创粉丝点击