C++学习随笔6 基于过程编程(2)- 性能

2. 性能

  • 内联函数

在C++中,函数调用需要建立栈环境,进行参数复制,保护调用现场,返回时,还要进行返回值复制,恢复调用现场。这些工作都是与完成特地任务的操作无关的额外开销。

程序效率由于该项工作而受到影响,如果频繁调用很少语句的小函数,则这些开销相对来说占的比重就大了。我们既要用函数调用来体现其结构化和可读性,又要使效率尽可

能地高。解决办法就是将这种小函数声明为内敛(inline)。

1. 对函数的内敛声明必须在调用之前。因为内联函数的代码在程序运行时是直接嵌在调用处执行的,它不影响链接,只在编译时确定运行代码。

2. 内联函数中不能含有复杂的结构控制语句,如switch和while。如果有,则编译将无视内敛声明,视为普通函数那样。

3. 函数体适当小,通常只有1-5行,不能为递归函数。 

inline bool isnumber(char);        //内敛声明

int main()
{
   char c;
   while(cin>>c && c!='\n')
        if(isnumber(c))  cout<<"you entered a digit.\n";
        else cout<<"you entered a non-digit.\n";
}

bool isnumber(char ch)
{
   return ch>='0' && ch<='9' ? 10;
}
  • 数据结构

程序员首选的方法是在STL中,选择容器来存储数据,只有在很特殊或很专业的情况下,才自己定义或派生容器数据类型。每一种STL中的数据结构都能解决一类数据处理问题。

如链表(list)结构适合处理一群同类数据需要大量地从中间进行插入和删除元素。

  • 算法
  • 标准C++算法

#include <algorithm>

算法库总是对元素集合进行操作(容器),标准算法调用中的参数,需要指出元素集合的首尾位置,首位置的元素是包含在算法处理中的,尾位置是不包含在算法处理中的。指示元素位置并不是元素下标而是迭代器对象,它的类型名称为:“容器类型<元素类型>::iterator”。多数情况下,要处理的数据为整个容器的所有内容,这时,只要取容器的begin()与end()成员即可。begin()指向第0个元素,end()指向最后一个元素+1的位置。

  • 动态内存

预留向量空间:

若大概知道元素的个数,就可以用reserve操作来预留若干空间,以免于在频繁进行向量插入情况下,内存的频繁申请与释放内存操作了 。

 

posted @ 2016-11-27 20:34  etcjd  阅读(136)  评论(0)    收藏  举报