effective c++ 笔记 (30-31)


//---------------------------15/04/17----------------------------

//#30   透彻了解inlineing的里里外外

{

/*  

    1:inline函数通常可以免除函数调用的成本,而且编译器会对它执行语境相关最优化。

    2:使用inline函数很有可能增加你的目标码的大小。因为对每个函数的调用都使用函数本体来替换,如果函数

      本体很大的话代码膨胀是肯定的。但是如果inline函数的本体很小,那么将产生出小的码。

    3:inline只是对编译器的一个申请,不是命令。

    4:定义在class定义式内的成员函数默认使用inline

    5:inline函数通常一定被置于头文件,因为一般情况下,编译器在编译期间必须要知道函数本体才能替换成功。

    6:编译器拒绝一些复杂的inline函数,比如递归(书上说循环也不行,但是记得看到过很多人都说循环是可以inline

      ),编译器拒绝virtual函数,因为这些函数到了运行期才确定调用哪一个函数。

    7:编译器不对通过函数指针而进行的调用实施inlining

    8:不要对构造和析构函数指定inline

    9:inline函数使得用到这个函数的程序,在函数改动后必须重新编译。

    10:总结:一开始别使用inline,当遇到造成效率影响的20%的代码时,可以找机会将它inline

 

*/

}


//#31   将文件间的编译依存关系将至最低

{

/*

    1:考虑三个设计策略:

        1>如果使用object references object pointers可以完成任务,就不要使用objects

            如果只需要pointreferences,编译器就不需要知道object的大小,也就不需要知道它的

            具体定义,当使用这个object pointer时,可以包含一个声明式就好。

        2>如果可能,尽量以class声明式替换class定义式。

            这样除非到了真正调用时,就可以不管class的定义。也就去除了编译依存。

        3>为声明式和定义式提供不同的头文件。

            为了实现上面的准则,提供声明式的头文件,就可以让客户选择只包含声明。

    2:实现声明和实现分离的办法有两个:

        1>在类中包含一个需要具体操作的指针对象,在需要功能的时候通过指针对象的功能:         */

    #include "PersonImpl.h"

    #include "People.h"

    

    Person::Person(const std::string& name,const Date& birthday, const Address& addr)

    : pImpl(new PersonImpl(name, birthday, addr)){}

    

    std::string Person::name()const

    {

       return pImpl->name();

    }

/*      其实这就是设计模式中桥接模式的思想。分离接口与实现的技术。

        2>通过接口一个接口类,这个类没有成员变量,只有一个virtual析构函数和一组pure virtual

          客户可以使用这个接口类,必须只能使用这个类的指针,因为内含pure virtual函数的class

          无法实例化的。然后使用一个工厂类来获得具体对象。

        其实这就是设计模式中的工厂方法模式。

    3:记得一点:

        头文件应该以完全且仅有声明式的形式存在。

 

*/

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值