代码库> 其他> A7处理器 LP64位简要概述
A7处理器 LP64位简要概述
关注
上传者:yunhuaikong 分类:其他(Others)
查看次数:4018 下载次数:143
上传时间:2013-09-13 大小:412 B

A7处理器 LP64位简要概述


【从理论上说,64位A7处理器意味着iPhone性能会大有提高,性能和速度可以翻倍;但在现实环境中,可能只有15-30%的性能提升。
  一些程序如果专门针对64位iPhone开发,它可以更好地利用CPU和RAM,但到目前为止这类程序并不多。
  用一个简单的例子来类比64位的好处:
  有一个巨大的图书馆,里面有许多藏书,还有一个管理员帮你找书。管理员有32个助理,他们骑着自行车前去取书,然后交给管理员。某天来了一个借书的人,他想要关于恐龙的所有图书,图书馆有65本相关的书藉,那么助理们要跑三趟。第一趟取来32本,第二趟也是32本,最后一本还要一个助理跑一趟。不论如何,虽然最后只取一本书,还是要花三趟的时间。
  如果图书馆有64位助理,就只需要跑2趟。如此一来就能大大节省时间,但是要注意,时间并不是缩短一半,因为在第二趟时,仍然只是一位助理跑一趟取1本书,虽然还有63位助手闲置,但无法让时间缩短。
  假如图书馆有256本相关的图书,32位助理要跑8趟,64位就只跑4趟。
  iPhone的运行与此相似,它从内存获得数据,一个时钟周期内32位只能处理32位的数据,64位就可以取得64位的数据,如此一来速度、性能、效率就提高了。




ILP32是什么:
ILP分别代表数据类型中的int,long,pointer。即,整形,长整型,指针。这三种类型及其任意组合为4个字节[double,long long除外,为8字节],即32位。其他的数据类型要么是8字节[long long],要么是2字节[short int],要么是1字节[char bool]。


LP64是什么:
LP分别代表数据类型中的long,pointer。即,长整型,指针。这二种类型及其任意组合为8个字节,即64位。其他的数据类型要么是4字节,要么是2字节,要么是1字节。


懂了吗?看下图。



也就是说在A7处理器架构下:
指针类型从4字节增加到8字节
长整型从4字节增加到8字节[long long也没有变。在ILP32下本身就是8字节,LP64下也是8字节没有变化]


除此之外,别的都没有变化。还要注意在LP64下,有一个数据类型发生了变化。CGFloat不再是float类型,而是double类型,8字节。
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
#else
# define CGFLOAT_TYPE float
#endif


故,在编写代码中,注意以下几点:
避免将64位的长整型赋值给一个32位的整型。
避免将64位的指针赋值给一个32位的整型。


看一下例子:整型指针转化成一个整型
int *c = something passed in as an argument....
int *d = (int *)((int)c + 4); // Incorrect.   //将一个整型指针转化成一个整型,错误!
int *d = c + 1;               // Correct!




返回值不匹配,会导致潜在的风险:
long PerformCalculation(void);//定义一个函数


int  x = PerformCalculation(); // incorrect,将一个长整型赋值给一个整型,错误!
long y = PerformCalculation(); // correct!


同样的错误,参会类型不匹配:
int PerformAnotherCalculation(int input);//定义一个函数
long i = LONG_MAX;
int x = PerformCalculation(i);//将一个长整型参数仁慈给一个整型参数,错误!




再看一个例子:
int a=-2;
unsigned int b=1;
long c = a + b;
long long d=c; // to get a consistent size for printing.
printf("%lld
", d);
在ILP32下,d的结果是-1,16进制即0xffffffff
但是在LP64下为
d的结果是4294967295 (0x00000000ffffffff),


收藏
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0
提示
sina weixin mail 回到顶部