zoukankan      html  css  js  c++  java
  • 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.内联消除了常被使用的小函数调用所产生的函数开销。

  • 相关阅读:
    LVS基于DR模式负载均衡的配置
    Linux源码安装mysql 5.6.12 (cmake编译)
    HOSt ip is not allowed to connect to this MySql server
    zoj 3229 Shoot the Bullet(无源汇上下界最大流)
    hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
    poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
    URAL 1430 Crime and Punishment
    hdu 2048 神、上帝以及老天爷(错排)
    hdu 3367 Pseudoforest(最大生成树)
    FOJ 1683 纪念SlingShot(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/Azhu/p/2591455.html
Copyright © 2011-2022 走看看