杨继珩ID:jasonme
34993次访问,排名3112好友0人,关注者0
jasonme的文章
原创 30 篇
翻译 0 篇
转载 0 篇
评论 24 篇
jasonme的公告
都是一些自己的学习笔记,翻译文档以及实际项目中的心得,希望跟大家分享,也希望得到大家的指点和指正,欢迎大家联系我。 都是原创文,如果有转载的话,请注明,谢谢! email: jasonme@126.com
最近评论
ROBINS:小弟是刚进入这个领域的,看了你的笔记,觉得很好,既有教导也有探讨.我会继续学习你的笔记的,希望以后你能多多指教!
mana:大虾,《MPEG 4 & H.263视频编码从基础到深入》这本书哪有买,如果是电子版能发一分给我好嘛txgreal@126.com,我在做mpeg4编解码的研究,缺少资料啊
sky911911]:学习ing。。。。。。。。。。。。
文章分类
收藏
    相册
    Link
    Jason搬家了,这里空间不再用了.新家点这里
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 C++ FAQ阅读笔记[3]--内联函数收藏

    新一篇: SED,AWK学习笔记Part 2-----sed编辑器 | 旧一篇: SED,AWK学习笔记Part 1-----利用正则表达式进行文本匹配

    W[9.1] 内联函数是干嘛的?
    内联函数是将被插入到调用者代码流中的函数,就像一个#define的宏一样,内联函数通过避免调用自己和(特别是)通过编译在调用过程中优化调用过程(过程整合)来达到提升性能的效果.

    [9.2] 内联函数是如果保证安全和速度的平衡性的?
    在C中,你可以通过在结构体里面放置一个void*来达到"封装的结构体",这种情况下,void*指向结构体中用户不知道的实际数据。这样结构体的用户就不知道如何解释用void*指向的内容,但是访问这些函数的时候就会从void*型自动转换为相应的合适的类型。这就给出了一种形式的封装。

    不幸的是它失去了类型的安全性,它也在强制函数调用的时候要访问结构体中每个角落的数据(如果你允许对结构体进行直接的访问的话,任何人都可以访问它们,因为他们有必要知道他们如何解析用void*指向的东西,这个会让改变数据结构的时候变得更加困难了.

    C++类允许函数调用扩展内联.这就可以让你安全地进行封装,而且保证了快速的直接的访问.此外,这些内联函数的参数类型是由编译器来进行检查的,这是对于C中的#define宏的一个改进.

    [9.3] 我为什么要用内联函数呢?而不是用原来好好的#define宏?

    因为#define宏在四个方面是非常糟糕的(这里的内容没有找到,比较遗憾)

    不像#define宏,内联函数可以避免声名狼籍的宏错误因为内联函数总是对每个参数精确匹配一次。换言之,调用内联函数在语义上只是像调用了一个正则表达式,只是要更快一些:

    //一个返回i绝对值的宏
    #define unsafe(i)  ( (i) >=0 ? (i) : -(i) )

    //一个返回i的绝对值的内联函数
    inline int safe(int i)
    {
     return i>=0?i:-i;
    }

    int f();

    void userCode(int x)
    {
     int ans;

     ans=unsafe(x++);
     ans=unsafe(f());

     ans=safe(x++);
     ans=safe(f());
    }


    与宏不一样的是,参数的类型是会被检查的,不必要的会话会被正确的处理。

    宏对你的程序的健康是不利的,除非不得以,否则不要用它们!

    [9.4] 你怎么让编译器识别一个非成员函数的内联函数?
    当你申明一个内联函数的时候,它看起来就像是一个普通的函数:
    void f(int i,char c)
    但是当你定义一个内联的函数,你把函数的定义加上inline关键字,当你所以下的定义放入头文件之后:

    inline
    void f(int i,char c)
    {
     //...
    }
    注意:把一个函数的定义放到一个头文件里面是一个规则性的东西。除非函数只是在一个单独的cpp文件中调用到了。特别的,如果你把内联函数放在一个cpp文件里面,而你从其他的cpp文件里面调用它,你会在连接器得到一个"unresolved external"错误。

    [9.5] 你怎么让编译器识别一个内联的成员函数?
    当你定义一个成员函数的时候,它看起来就像是一个普通的成员函数:

    class Fred  {
    public: 
     void f(int i,char c);
    };

    但是如果你定义一个内联的成员函数的时候,你就得在函数定义前使用inline关键字,并且把这个定义放到一个头文件中,
    inlune
    void Fred::f(int i,char c)
    {
     //...
    }

    注意:把一个函数的定义放到一个头文件里面是一个规则性的东西。除非函数只是在一个单独的cpp文件中调用到了。特别的,如果你把内联函数放在一个cpp文件里面,而你从其他的cpp文件里面调用它,你会在连接器得到一个"unresolved external"错误。

    [9.6] 是不是有另外一种方法让编译器识别到一个内联的成员函数?
    是的!在类体内定义一个成员函数的时候就相当于把它申明为一个内联函数:

    class Fred  {
    public:
     void f(int i,char c)
     {
      //...
     }
    };

    尽管这对于写这个类的人来说更加简单一些,但是这个对于所有的阅读者来说就变得更加困难了,因为它混了什么是一个类与这个类怎么实现它两个问题。因为这个混淆的存在,我们通常用inline关键字在类的外面定义成员函数。这个认识就有以下的意义了:在一个面向代码重用的世界里,有很多人会使用你的类,但是只有一个人来编写它(你自己),这样你就应该做一些能让更多的人受益的事,而不让极少数人受益.

    [9.7] 内联函数会一定让你的程序性能更好吗?
    不是的。

    注意内联函数的过度应用会造成代码的膨肿,这个会让分页平台环境的性能降低。

    发表于 @ 2005年02月05日 23:06:00|评论(loading...)|编辑

    新一篇: SED,AWK学习笔记Part 2-----sed编辑器 | 旧一篇: SED,AWK学习笔记Part 1-----利用正则表达式进行文本匹配

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © jasonme