Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181141
  • 博文数量: 65
  • 博客积分: 1790
  • 博客等级: 上尉
  • 技术积分: 460
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-21 23:51
文章分类
文章存档

2012年(8)

2011年(38)

2010年(19)

分类: C/C++

2011-02-24 23:48:16

C中包含效率的一个方法是使用宏macro,宏可以不用普通函数调用就使之看起来像函数调用。宏的实现是预处理器而不是编译器,预处理直接用宏代码代替宏调用。

C++用了内联函数inline function解决效率问题。

1,预处理器的缺陷

括号问题

边际效应

2,内联函数

内联函数在任何意义上都是真正的函数,唯一不同之处是内联函数在适当时像宏一样展开,所以函数调用的开销被取消。

类中定义的函数自动成为内联函数,类外定义的函数使用inline关键字成为内联。必须使函数体和声明结合在一起才有效。

inline int plusOne(int x);//无效inline函数

inline int plusOne(int x){return ++x;}//内联函数

:::一般把内联定义放在头文件里

头文件里,内联函数默认是内部连接,即它是static,只能在它被保护的编译单元看到。

3,类内部内联函数

自动成为内联函数

4,存取函数

读或修改对象状态,get,set

5,内联函数和编译器

编译器检查内联函数正确无误后,在调用内联函数时,内联函数代码就会直接替换函数调用,消除调用的开销。

6,局限性

假如函数太复杂,编译器将不能执行内联。一般地,任何种类的循环都被认为太复杂而不扩展为内联函数。

假如要显示或隐含取函数地址,编译器也不能执行内联。这时编译器必须为函数代码分配内存从而产生一个函数地址。

7,赋值顺序

假如一个内联函数对于一个还没有在类里声明的函数进行向前引用,编译器就可能不能处理它。

6,依然使用的宏

assert()

程序调试成功后由一个#define NDEBUG消除

#define NDEBUG

int i=1;

assert(i,"value must be nonzero")

阅读(806) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~