64位C++编程课堂
来源:互联网 发布:android wifi源码分析 编辑:程序博客网 时间:2024/06/05 17:10
本系列为http://www.viva64.com/en/l/的学习总结
Lessons 1. What64-bit system are
目前有2种最流行的64位处理器架构:IA64和Intel 64。IA64即通常所说的安腾,主要用于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位的系统DLL,64位的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位的。
要想让代码在32位与64位自由编译通过,首要是解决size_t和ptrdiff_t带来的编译警告!
size_t用来储存数组的理论最大长度,ptrdiff_t(intptr_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位标准类型的对比图。
- 64位C++编程课堂
- 64位C++编程课堂
- 课堂笔记--位运算
- 64位与32位编程的数据类型区别(C/C++)
- 64位与32位编程的数据类型区别(C/C++) (主要介绍windows)
- 64位与32位编程的数据类型区别(C/C++)
- 64位与32位编程的数据类型区别(C/C++)
- 64位与32位编程的数据类型区别(C/C++)
- Windows 64 位版本的C/C++编程
- Windows 64 位版本的C/C++编程
- Windows 64 位版本的C/C++编程
- Linux 64位C编程过程中的注意点
- 64位Ubuntu中C与intel汇编混合编程
- C编程注意32位机器和64位机器的差别及unsigned和signed
- 课堂结对编程
- 64位编程
- 64位编程
- 64位编程网址
- 重装后只有C盘,资料丢失
- 实用好习惯,让一个人每天进步
- DEMO
- 第十周项目 3 日期时间类
- Twister—迭代MapReduce
- 64位C++编程课堂
- GRE一个月突击高分备考时间安排
- iOS中如何通过instruments工具来找崩溃信息
- Apache编译、PHP编译
- linux程序设计——shell程序设计(第二章)
- LeetCode_11---Container With Most Water
- 关于Android的Activity的onCreate多次调用的问题
- 慢慢的走上性能优化之路
- 【十五】排序算法(一)