C++编程思想008

preview
需积分: 0 7 下载量 50 浏览量 更新于2008-05-08 收藏 507KB PDF 举报
在C++编程中,效率是极其重要的因素,这也是C++能吸引程序员的关键原因之一。C语言通过宏(macro)提供了一种提升效率的方式,它允许在编译前替换文本,从而避免了函数调用的开销,如参数压栈、生成汇编语言的CALL指令、返回参数和RETURNS指令。然而,C++引入了内联函数(inline function),以解决C中宏带来的问题。 预处理器宏在C++中存在两个主要问题。宏虽然看起来像函数调用,但它们的语义并不完全相同,可能导致难以察觉的错误。例如,宏定义中的空格可能会导致意外的解析问题,使得表达式的计算结果与预期不符。此外,宏在展开时会立即展开其参数,无论参数是否有副作用,这可能导致意外的多次计算或副作用,如自增操作的不当执行。这些问题在函数调用中是不会出现的,因为函数参数只在函数调用时计算一次。 C++的内联函数解决了这些宏的缺点,同时保留了效率。内联函数在编译时被插入到调用点,避免了函数调用的开销,但它能像普通成员函数一样访问私有数据。这使得内联函数在类中更为实用。内联函数通过`inline`关键字声明,但最终是否内联由编译器决定,以防止过度膨胀的代码导致的编译错误。 内联函数的使用策略通常包括: 1. 只对小函数使用内联,因为大函数可能导致编译后的代码体积过大。 2. 尽量避免在内联函数中使用循环和复杂的控制结构,这可能导致编译器拒绝内联请求。 3. 如果一个函数在多个地方被调用,内联可以提高效率,但在头文件中声明内联函数时,需确保所有包含该头文件的源文件都能看到相同的内联定义,以避免链接错误。 4. 对于模板函数,通常默认是内联的,因为它们必须在每个使用点被实例化。 C++标准库中的一些函数,如`putc()`和`toupper()`,可能会以宏的形式存在,这可能导致参数被多次计算,因此在编写和使用库函数时需要注意这些问题,避免潜在的性能损失或错误。 C++通过内联函数提供了一种更安全、更灵活的方式来替代预处理器宏,以实现高效的代码执行,同时减少了宏所带来的潜在问题。在实际编程中,应谨慎使用宏,并优先考虑使用内联函数,特别是在处理可能有副作用的参数时。