c/c++:efficient c++,跟踪实例
再看 efficient c++, 写一下笔记。
这是写第一章:跟踪实例。
主要讲一个类,用于跟中,有一个公共变量控制是否需要跟踪,跟踪什么这个看个人要求,通过怎么实现跟踪类能够达到消耗最低。
//初始版本 class Trace { public: Trace(const string &name); ~Trace(); void debug(const string &msg); static bool traceIsActive; private: string theFunctionName; }; inline Trace::Trace(const string &name):theFunctionName(name) { if(traceIsActive) { cout<<"Enter function "<<name<<endl; } }
初始时类的构造如上。
调用版本1
//调用版本1 int addOne(int x) { string name = "addOne"; Trace t(name); retur x+1; }
将 构造函数的参数类型从 string 变为 char * 。
//构造函数2,调用版本2, int addOne(int x) { char *name ="addOne"; Trace t(name); return x+1; } inline Trace::Trace(const char* name):theFunctionName { if(traceIsActive) { cout<<"Enter function "<<name<<endl; } }
这样在 Trace(name) 时不需要创建一个 name 的字符串。
在需要跟踪的时候类才给自身的变量分配空间。
//构造函数3,需要修改class 中theFunctionName 的类型, Trace::Trace(const char* name):theFunctionName(0) { if(traceIsActive) { cout<<"Enter function "<<name<<endl; theFunctionName=new string(name); } } class Trace { private: string * theFuntionName; } inline Trace::~Trace() { if(traceIsActive) { delete theFunctionName; } }
最后的版本的开销最小,具体数据就看书上的。
要点:
1.对象定义会触发隐形地执行构造函数和析构函数。
2.因为通过引用传递对象还是不能保证良好的性能,所以避免对象的复制的确有利于提高性能。但是如果我们不必一开始就创建和销毁该对象(与temp 相反)的话,这种方式将更有利于性能的提升。
3.不要把精力浪费在计算结果根部不会被使用的地方。(如上面当traceIsActive为FALSE时的第二个版本,该类都会为创建string 空间)
4.在完成同样的简单工作时,(简单工作!)char 指针有时比string 对象更有效率。
5.内联消除了常被使用的小函数调用所产生的函数开销。