64位C++编程课堂

来源:互联网 发布:android wifi源码分析 编辑:程序博客网 时间:2024/06/05 17:10

本系列为http://www.viva64.com/en/l/的学习总结


Lessons 1.     What64-bit system are

目前有2种最流行的64位处理器架构:IA64Intel 64IA64即通常所说的安腾,主要用于Sun的服务器上;而Intel64则是与x86兼容的,本文主要讨论这种。

         x86-64有以下优点

l  64位寻址空间,意味着最高内容不再限制到4G。不同版本的Windows寻址能力都有一定限制,最高为1Tb

l  扩展的寄存器,64位的寄存器能允许更多操作(例如,程序中最多只能有4个硬中断也是因为寄存器只有32位而限制的)

l  指令集与原来的相似

l  兼容32位程序

l  兼容32位系统

 

WoW64 —— Windows-on-Windows 64,不是魔兽世界。因为64位的Windows程序也要支持32位,WoW64是一个可以把32位的指令转换为64位的一种模式,或者是一种子系统。(类比32位机上执行16位程序,其实上就是存在一个16位子系统)


Lession 2.     Supportof 32-bit applications in the 64-bit Windows environment

         从上面我们看到,32位程序在64位上通过WoW64来运行。WoW本身是一个软模拟,它会损失大约2%的性能!如果确实不能编译为64位,有的编译器提供支持3GB以上内存分配,这一优势在64位上得以延续,它能够访问4G以上的内存(可能要链接特别的库)。

 

         DLLHell

         这一古老问题一起延续至今!以至于为了让32位程序在64位上不要调用64位的系统DLL64位的WOW%systemroot%\Windows目录重定向到%systemroot%\SysWOW64下,也就是说,在SysWOW64目录下是为32位程序准备的系统DLL。目前,Windows在逐渐放弃32位的支持。(PS:64位系统已经不支持16位程序)


Lesson 3. Portingcode to 64-bit systems. The pros and cons

         尽管64位非常有吸引力,但是有没有必要让程序支持64位呢?如果是维护此前的32位程序,升级的操作就有待商榷;另外,如果有用到第3方库,也需要考虑其是否支持64位。

         如果是新开发一款软件,那就有必要考虑64位问题,即使它不准备以64位发布。作为一个开发者,对未来的预测意识是必要的,因为你无法肯定那天你的代码就要以64位发布了。

 

Lesson 4. Creatingthe 64-bit configuration

         你需要一个支持输出64位的编译器,最好开发机也是64位的。


Lesson 5. Building a 64-bit application

         要想让代码在32位与64位自由编译通过,首要是解决size_tptrdiff_t带来的编译警告!

         size_t用来储存数组的理论最大长度,ptrdiff_tintptr_t)用于索引数组或保存一个指针的值。size_t常常来源于C库函数,比如strlen等;而ptrdiff_t主要来自for循环,并且它位常常是相互影响的(因为在32位程序下,很多人将数组的大小和遍历都是是用int来代替,事实上它们都是不标准的)。只有改变编程习惯,才能消除它们。

Lesson 6. Errors in 64-bit code

         64位程序如果通过编译器警告来找出BUG,这还算是比较幸运的了,然而更多的问题是编译器发现不了的。通常有以下几种情况:

l  在计算指针大小时的错误(惯性思维会认为是4!)

l  访问超过2G以上的数组(惯用的int会变为负数!)

l  读写函数的返回值(如果不小心用int保存,有可能溢出)

l  位操作符(这通常发生size_t等变化长度的类型上)

l  复杂的指针运算(指针最好不要直接与整数计算)

 

还有更多的情况,但最大的差异说到底还是来自于指针长度,这种BUG隐藏得非常深;至于溢出,它发生的条件是原来的代码也存在溢出的风险!对于经历过严格测试的代码来说,这种概率比较小。最后,给出一张C++64位与32位标准类型的对比图。

0 0
原创粉丝点击