免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4758 | 回复: 8
打印 上一主题 下一主题

成员函数inline [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-29 13:20 |只看该作者 |倒序浏览
如果把成员函数的定义写在类里面,那这个函数就是自动inline的,对吗?
如果是这样,又有一个新问题:
gcc 4.1.2的stl里面看到容器模板的成员函数都是在模板内定义的,这样当实例化这些容器时,得到的类,其成员函数会不会是inline的?如果是,那代码膨胀岂不是会很厉害

论坛徽章:
0
2 [报告]
发表于 2010-07-29 13:30 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2010-07-29 13:42 |只看该作者
这个视编译器喜好的,自己写上inline的函数,也是

论坛徽章:
0
4 [报告]
发表于 2010-07-29 14:04 |只看该作者
ls意思是inline还是非inline,并不能完全由写程序的人决定,即使加上了inline,编译器也可能把它编译成非inline的?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2010-07-29 14:14 |只看该作者
回复 4# cjog

you got it

论坛徽章:
0
6 [报告]
发表于 2010-07-29 14:40 |只看该作者
谢谢各位。
OwnWaterloo,不管编译器最终有没有把函数编译成inline的,只要成员函数是定义在类(不是类模板)的内部,在多个编译单元中包含该头文件时,编译器(或者链接器)会负责删除(可能出现的)多份定义,这样就不会有重定义符号错误了,对吗

以前问个一个问题,跟这个问题有点关联,4楼是你的解答
http://bbs.chinaunix.net/viewthread.php?tid=1674160

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [报告]
发表于 2010-07-29 21:31 |只看该作者
stl里面看到容器模板的成员函数都是在模板内定义的
------ 可以定义在外面的
另外,inline只是一个“编译建议”

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
8 [报告]
发表于 2010-07-31 18:22 |只看该作者
回复 6# cjog

C++的inline函数或者函数模板都可以放在头文件中, 被多个翻译单元包含并编译。
最终链接时不会重复定义。

member function放在定义体内也是inline函数。

下面的都可以放在头文件中

  1. inline int abs(int x) { return x<0? -x: x; }
  2. // inline函数

  3. template<typename T>
  4. T max(T a, T b) { return a<b? b: a; }
  5. // 函数模板

  6. template<typename T>
  7. inline T min(T a, T b) { return a<b? a: b; }
  8. // inline函数模板

  9. struct point
  10. {
  11.       double radius() const { ... }
  12.       // inline 函数
  13.       ...
  14. };

  15. template<typename T>
  16. class vector {
  17.       size_t size() const { ... }
  18.       // inline函数模板

  19.       void push_back(T const& x);
  20. };

  21. template<typename T>
  22. void vector<T>::push_back(T const& x) { ... };
  23. // 函数模板
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-08-01 08:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP