9.1.1 可移植性的优缺点
可移植性通常会和效率与实现的难易程度相互制约。具体地说来,在一个或者多个平台上,容易实现的可移植代码通常都是低效的。譬如,假设我们希望清除内存中从位置p开始的n个字节。可以如下编写代码:
- memset(p, n, 0);
对于每个提供了ANSI/ISO C++(www.cppentry.com)程序库的平台,这段代码都是可移植的,因为该程序库已经定义了memset函数。现在假设我们要求清除内存的这段代码具有很高的实时性;于是我们可以使用bzero函数,它清除内存的速度要比memset函数快,但只有某些平台提供这个函数:- bzero(p, n); //要比memset(p, n, 0)快。
然而,bzero函数可能并不在ANSI/ISO C++(www.cppentry.com)程序库里面;因此调用bzero函数可能会破坏我们代码的可移植性。
为了保留原来的移植性,并且在含有 bzero 函数的系统中体现实时的要求,我们可以如下改写我们的代码:
- #indef HASBZERO
- bzero(p, n);
- #else
- memset(p, n, 0);
- #endif
我们假设某些定义有HASBZERO的平台都会提供bzero函数。另外,如果我们在好几个地方都调用了bzero函数,我们也可以自己编写一个bzero函数,让那些没有提供bzero函数的平台也可以调用这个函数:- bzero. h:
- #include<stdlib.h>
- #include<memory.h>
- #ifndef HASBZERO
- inline void* bzero(char* P, size_t n){
- return memset(p, n, 0);
- }
- #endif
如果所有提供bzero函数的平台都把这个函数包含在stdlib.h头文件中,那么当我们需要清除内存的时候,就可以如下编写代码:- #include<bzero.h> //bzero.h头文件已经包含了stdlib.h头文件
- //...
- bzero(p, n);
这段代码不但是可移植的,而且是高效的。然而,与前面只是简单地调用memset函数相比,这段代码的实现又是困难的。通常地讲,把实际代码移植到很多平台都会使代码变得复杂,甚至很不优雅。