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' ? 1 :0; }
- 数据结构
程序员首选的方法是在STL中,选择容器来存储数据,只有在很特殊或很专业的情况下,才自己定义或派生容器数据类型。每一种STL中的数据结构都能解决一类数据处理问题。
如链表(list)结构适合处理一群同类数据需要大量地从中间进行插入和删除元素。
- 算法
- 标准C++算法
#include <algorithm>
算法库总是对元素集合进行操作(容器),标准算法调用中的参数,需要指出元素集合的首尾位置,首位置的元素是包含在算法处理中的,尾位置是不包含在算法处理中的。指示元素位置并不是元素下标而是迭代器对象,它的类型名称为:“容器类型<元素类型>::iterator”。多数情况下,要处理的数据为整个容器的所有内容,这时,只要取容器的begin()与end()成员即可。begin()指向第0个元素,end()指向最后一个元素+1的位置。
- 动态内存
预留向量空间:
若大概知道元素的个数,就可以用reserve操作来预留若干空间,以免于在频繁进行向量插入情况下,内存的频繁申请与释放内存操作了 。

浙公网安备 33010602011771号