25.1.1 硬件架构问题(1)
硬件架构这个词通常指的是运行程序的处理器或一族处理器。运行Windows或Linux的标准PC通常运行在x86架构上,较老版本的Mac OS通常运行在PowerPC架构上。作为一门高级语言,C++(www.cppentry.com)屏蔽了这些硬件架构之间的差异。例如,Pentium处理器可能有一条指令需要用6条PowerPC指令才能实现同样的功能。作为一名C++(www.cppentry.com)程序员,您不需要理解这个差异,甚至不需要知道存在这种差异。使用高级语言的一个优势是:编译器会负责将您的代码转换为处理器原生的汇编代码格式。
然而,处理器的区别有时候会上升到C++(www.cppentry.com)代码的层次。除非您在完成最底层的编码工作,否则您基本上不会面对这些问题,但是您应该意识到这些问题的存在。
1. 二进制兼容性
您可能已经知道,不能将为Pentium计算机编写和编译的代码放在基于PowerPC的Mac计算机上运行。这两个平台没有二进制兼容,因为这两个平台的处理器不支持同一个指令集。当您编译一个C++(www.cppentry.com)程序的时候,您的源代码被转换为计算机执行的二进制指令。这个二进制指令的格式是由平台定义的,而非由C++(www.cppentry.com)定义。
支持二进制不兼容平台的一种方法是利用不同目标平台的编译器分别生成每一个版本。
另一个解决方案是交叉编译。例如您使用平台X作为开发平台,但是您需要让您的程序运行在平台Y和Z上,您可以在平台X上使用交叉编译器生成平台Y和Z的二进制代码。
您也可以开放您的程序的源代码。通过向最终用户提供源代码,用户可以在自己的系统上原生地编译代码,并构建一个适合计算机的正确二进制格式的版本。根据第2章中所讨论的,开源软件已经越来越受欢迎。主要原因之一就是开源软件允许程序员合作开发软件,增加软件可以运行的平台数。
2. 地址大小
当有人描述一个硬件架构是32位的时候,他们最有可能说的是地址大小为32位,也就是4字节。在一般情况下,具有更大地址空间的系统可以处理更多内存,并且可以更快地处理复杂程序。
由于指针是内存地址,所以指针的大小和地址大小本质上是绑定的。许多程序员被教导指针总是4个字节,但这是错误的。例如,考虑下面这个输出指针大小的程序:
- int *ptr;
- cout <<"ptr size is " << sizeof(ptr) << " bytes" << endl;
- 代码取自PtrSize\PtrSize.cpp
如果这个程序在32位x86系统上编译运行,例如Pentium架构,输出将是: - ptr size is 4 bytes
如果通过64位的编译器在64位x86系统上编译运行,如Intel Core i7,输出将是:- ptr size is 8 bytes
从程序员的角度来看,不同的指针大小意味着不能把指针等同地看做4字节。更普遍地讲,您必须要知道,大多数大小都不是C++(www.cppentry.com)标准规定的。标准只说了短整数应该不大于整数,整数不大于长整数。 指针的大小也不一定和整数的大小一样大。例如,一个64位的平台上,指针是64位的,但整数可能是32位的。将一个64位的指针强制转换为一个32位的整数将丢失32个关键位! 提示:永远不要假设一个指针是32位或4个字节,永远不要将一个指针强制类型转换为一个整数。