虚函数可以内联展开吗?

zju001 2009-04-02 05:38:59
如题
...全文
342 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zju001 2009-04-03
  • 打赏
  • 举报
回复
虚函数有时候可以内联,有时候不可以..要看用户是怎么调用虚函数的.
*如果用户使用指针或者引用调用虚函数,就一定不能内联展开.
*其它情况,如使用对象去调用,或使用::作用域操作符限定.就可以内联展开.

如下例子:
Class aa;
Class *pa = &aa;
Class &ra = aa;
aa.func(); // 可以展开
pa->func(); // 不可以展开
ra.func(); // 不可以展开
pa->Class::func(); // 可以展开
wangyadong 2009-04-03
  • 打赏
  • 举报
回复

int b=0
Jarrys 2009-04-03
  • 打赏
  • 举报
回复
即使vertual函数使用inline,编译器也会强制变成非内联函数
biosli 2009-04-03
  • 打赏
  • 举报
回复
vertual函数不能inline,vertual是用指针去找函数,inline是代码拷贝(有点类似与define)
alwang_2008 2009-04-03
  • 打赏
  • 举报
回复
inline 只是建议,若加了virtual ,我的理解是编译器会选择的,有时候用inline,有时候用virtual。好像《inside C++ object model》是这样说的
zju001 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 once_and_again 的回复:]
有几个函数不能inline吧?
比如 构造?
[/Quote]

构造函数为啥不能内联?
我觉得任何比较短小的函数都可以内联.当然除了非常长的,递归的.
Jarrys 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zju001 的回复:]
写在CPP里的函数一定不能内联吗?即使加了inline关键词?
换句话说,要内联,一定要把函数定义写在.H文件中吗?
[/Quote]

期待中
sdljgxb 2009-04-03
  • 打赏
  • 举报
回复
内联是一个建议 而不一定被执行
fibbery 2009-04-03
  • 打赏
  • 举报
回复
内联函数需要在编译时确定的,也就是内联是编译时的行为,虚函数是实现多态的基础,也就是应用在运行时的概念,所以,虚函数是不能够内联的。
once_and_again 2009-04-03
  • 打赏
  • 举报
回复
有几个函数不能inline吧?
比如 构造?
wohow 2009-04-03
  • 打赏
  • 举报
回复
内联只是对编译器的“建议”,编译器可以根据具体情况接受或拒绝该建议。但是虚函数是C++定义,具有强制性,编译器必须实现多态。
现在的各个系统上面对于函数调用的开销非常小,小到可以忽略不计的地步,所以除非非常频繁的调用一些小函数(例如次数比较大的循环中),才考虑内联函数带来的性能提升,否则花点时间优化一下代码都比“inline”强的多
taoyanxu1989 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zju001 的回复:]
虚函数有时候可以内联,有时候不可以..要看用户是怎么调用虚函数的.
*如果用户使用指针或者引用调用虚函数,就一定不能内联展开.
*其它情况,如使用对象去调用,或使用::作用域操作符限定.就可以内联展开.

如下例子:
Class aa;
Class *pa = &aa;
Class &ra = aa;
aa.func(); // 可以展开
pa->func(); // 不可以展开
ra.func(); // 不可以展开
pa->Class::func(); // 可以展开
[/Quote]

很详细了 学习
nullah 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zju001 的回复:]
写在CPP里的函数一定不能内联吗?即使加了inline关键词?
换句话说,要内联,一定要把函数定义写在.H文件中吗?
[/Quote]
文章里没这样说吧
yin8086 2009-04-02
  • 打赏
  • 举报
回复
内联只是对系统的一个建议,一旦你把它变成虚函数,系统肯定不会内联它
zju001 2009-04-02
  • 打赏
  • 举报
回复
写在CPP里的函数一定不能内联吗?即使加了inline关键词?
换句话说,要内联,一定要把函数定义写在.H文件中吗?
nullah 2009-04-02
  • 打赏
  • 举报
回复
看了下,不过觉得没多大意义的,这样编译器会取消内联
没必要非得把实现写在cpp文件中...
反而写在.H文件中更直观些~~
fairchild811 2009-04-02
  • 打赏
  • 举报
回复
up上面的。

我们得出的结论是:最好不要使用内联虚函数,因为它们几乎不会被展开,即便你的函数只有一行,你最好还是将它与其它的类函数一起放在模块(cpp文件)中。当然,开发者常常将简短的虚函数放在类声明中-不是因为他们希望这个函数被展开为内联,而是因为这样做更方便和可读性更强。
nullah 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lingyin55 的回复:]
参考这篇文章吧
http://blog.csdn.net/hedylin/archive/2007/09/07/1775556.aspx
[/Quote]
学习~~
lingyin55 2009-04-02
  • 打赏
  • 举报
回复
wohow 2009-04-02
  • 打赏
  • 举报
回复
内联是编译时的代码复制,而虚函数是运行时才能找到函数入口,所以无论多么简单,虚函数都不能内联

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧