首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 有关inline函数
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 13:57:53 楼主
    在essential C++中提到,inline函数的定义最好放在头文件中,但是如果inline被优化了,那不是会出现函数被多次定义的问题吗?当inline被优化为普通函数的时候,在头文件中的一次定义,被多个文件inlcude了,这时候怎么处理的呢?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 14:03:231楼 得分:0
    头文件
    使用编译伪指令避免重复定义

    #ifndef _MY_HEADER_
    #define _MY_HEADER_

    //头文件内容
    ...
    ...

    #endif
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 14:06:132楼 得分:0
    (一)inline函数(摘自C++ Primer的第三版)

            在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。

      inline int min(int first, int secend) {/****/};

          inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline
    函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。当然,对于同一程序
    的不同文件,如果inline函数出现的话,其定义必须相同。对于由两个文件compute.C和draw.C构成的程序来说,程序员不能定义这样的min()函数,它在compute.C中指一件事情,
    而在draw.C中指另外一件事情。如果两个定义不相同,程序将会有未定义的行为:

          为保证不会发生这样的事情,建议把inline函数的定义放到头文件中。在每个调用该inline函数的
    文件中包含该头文件。这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且
    不可能在程序的生命期中引起无意的不匹配的事情。

    (二)内联函数的编程风格(摘自高质量C++/C 编程指南)

    关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

    如下风格的函数Foo 不能成为内联函数:
    inline void Foo(int x, int y); // inline 仅与函数声明放在一起
    void Foo(int x, int y)
    {
    }
    而如下风格的函数Foo 则成为内联函数:
    void Foo(int x, int y);
    inline void Foo(int x, int y) // inline 与函数定义体放在一起
    {
    }
    所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
    一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内
    联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数
    的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格
    的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需
    要内联。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 14:09:583楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 14:17:254楼 得分:0
    inline函数和字符常量可以多次定义,只要这些定义都相同。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 14:25:305楼 得分:0
    倒, “inline被优化为普通函数的时候”,这也能叫“优化”。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 14:34:416楼 得分:0
    引用 5 楼 taodm 的回复:
    倒, “inline被优化为普通函数的时候”,这也能叫“优化”。

    inline什么时候会这种“优化”??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 14:50:577楼 得分:0
    学习~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 15:08:198楼 得分:0
    引用 7 楼 lionc650 的回复:
    学习~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    发表于:2008-06-26 15:20:189楼 得分:0
    引用 2 楼 yyyapple 的回复:
    (一)inline函数(摘自C++ Primer的第三版)

            在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。

      inline int min(int first, int secend) {/****/};

          inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline
    函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。当然,对于同一程序
    的不同文件,如果inline函数出现的话,其定义必…

    摘抄的很详细
    我补充一下:
    inline 建议显式写出来:static inline,使其只具有文件内部可见性
    而GCC对这一点是默认的
    GCC的inline更容易理解:可以认为它是一个普通全局函数加上了inline的属性。即在其定义所在文件内,它的表现和static inline一致
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 22:31:0710楼 得分:0
    引用 4 楼 Fioman 的回复:
    inline函数和字符常量可以多次定义,只要这些定义都相同。


    字符常量可以多次定义可以理解,不过inline函数我在VS中测试了,不行。你能说的更清楚吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 22:44:4711楼 得分:0
    引用 1 楼 artman 的回复:
    头文件
    使用编译伪指令避免重复定义

    #ifndef _MY_HEADER_
    #define _MY_HEADER_

    //头文件内容
    ...
    ...

    #endif

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-26 23:01:1112楼 得分:0
    很愦憾的告诉大家,对于inline不必太关注,更不要对其优化程序的能力寄以厚望!

      因为,就算你正确的使用inline,这只是对编译器提出的一个内联请求,但编译器并不一定会如你所愿而实施内联。
     
      编译器自有一个复杂的算法,对你声明为inline以及并未声明为inline的函数决定其是否内联。换言之,如果你的函数代码并不满足编译器的内联标准,即使你声明为inline,编译器并不会为你的这个函数生成内联的码。如果你的函数代码简单到符合编译器的上述标准,现代编译器多半会自动使该函数的代码内联。且函数代码是否内联编译器并无提示。(请参考《More Exceptional C++中文版》page83)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttzzgg_80713
    • 等级:
    发表于:2008-06-27 10:07:2113楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 10:15:5614楼 得分:0
    谁能提供一个内联转宏程序?我用的编译器不支持内联
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 10:21:0015楼 得分:0
    要是inline对性能影响很大的话,早就“名扬天下”了

    to lz:即使编译器没有理会inline申请,或者根据需要把声明inline转为普通函数调用,也不会让定义在头文件里的违反One definition rule的,即编译器能确保该函数在编译单元内只有一份定义


    引用 12 楼 fish6344 的回复:
    很愦憾的告诉大家,对于inline不必太关注,更不要对其优化程序的能力寄以厚望!

      因为,就算你正确的使用inline,这只是对编译器提出的一个内联请求,但编译器并不一定会如你所愿而实施内联。
     
      编译器自有一个复杂的算法,对你声明为inline以及并未声明为inline的函数决定其是否内联。换言之,如果你的函数代码并不满足编译器的内联标准,即使你声明为inline,编译器并不会为你的这个函数生成内联的码。如果你的函数代…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 11:03:3516楼 得分:0
    引用 14 楼 iwillalwaysloveyou 的回复:
    谁能提供一个内联转宏程序?我用的编译器不支持内联


    直接将你的代码COpy一份到Caller里面~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 11:07:2017楼 得分:0
    引用 1 楼 artman 的回复:
    头文件
    使用编译伪指令避免重复定义

    #ifndef _MY_HEADER_
    #define _MY_HEADER_

    //头文件内容
    ...
    ...

    #endif

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 11:08:1418楼 得分:0
    16楼的,我有大量内联函数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-29 22:07:0019楼 得分:0
    inline对程序的优化作用再某些情况下是极其明显的,(在我给项目做性能优化的时候,只是根据profile改写一个函数为内联,性能提升了300% 40s ->10s 大概700W次调用)而我做性能优化的一个很大利器,就是使用内联。
    使用内联不一定能带来的性能的提示,但是在适当的情况下,他给你带来的惊讶是你之前所不能想象的。如果有些性能觉得重要的地方,可以使用aways inline强制编译器内联,只是你的承担内联带来的空间开销(同样会让你惊讶)。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-30 00:54:1320楼 得分:0
    #pragma once
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-30 01:31:5421楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-02 12:45:0722楼 得分:0
    用VC的话,如果优化级别-O2或-O3,类的有些成员函数都会inline进去,即使你并没有这样声明/定义。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-02 22:29:1223楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-02 22:47:0824楼 得分:0
    赞19楼
    窃以为实践得到的经验更宝贵些
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved