inline函数的问题

blacksky3 2009-05-01 11:44:45
大家都知道inline其实是替代c里面函数宏,目的是为了减少调用的开销,但是inline具体在什么时候会变得无效,想请大家讨论下

我目前总结的是:
1.inline函数对于指针或者引用调用无效,因为只有在这种情况下编译期不能知道具体引用类型,和函数是否是virtual无关

...全文
192 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
blacksky3 2009-05-03
  • 打赏
  • 举报
回复
up
SimonYeung 2009-05-02
  • 打赏
  • 举报
回复
有些时候即时没有用inline,但是编译器会根据情况进行优化
光宇广贞 2009-05-01
  • 打赏
  • 举报
回复
所以你目前“总结”的对于指针和引用无效的结论是不正确的……编译器一般自视强大,会无视你的要求……原谅丫吧……

本来,如果你明白到底什么叫做inline,你就应该知道你的总结与inline的原理没什么关系。

对于编译器来说void*型只不过是int 型的另一种写法罢了,所以使用C++语言不要特意去强调什么指针和引用的特殊之处。我到现在都认为C++是一种弱类型的语言,你用过C#就知道什么才叫做“强类型”。

你对C++的了解仅仅是纸上谈兵,不是贬义,要不说,为什么代码经验可以做为衡量程序员水平的标准呢……多写代码吧……
Jinhao 2009-05-01
  • 打赏
  • 举报
回复
inline并不是必须的,只是对编译器的一种优化请求,而你也不用关心这个请求的结果,编译器完全可以忽略你的请求,因为inline关键字并不会改变你函数的行为。
光宇广贞 2009-05-01
  • 打赏
  • 举报
回复
对于VC的编译器,是否内联是由command line里面的/o1, /o2选项来决定的。与你是否inline无关。你写的inline只是给看代码的“人”来看的。
Jarrys 2009-05-01
  • 打赏
  • 举报
回复
inline函数是否被优化,是在编译前由编译器决定的,它只优化满足特定条件的函数,比如:该函数比较精简或频繁调用,就会直接用函数内容代替函数调用
liliangbao 2009-05-01
  • 打赏
  • 举报
回复
帮顶~
pengzhixi 2009-05-01
  • 打赏
  • 举报
回复
这个要看编译器认为函数是否足够简单了.
alexhilton 2009-05-01
  • 打赏
  • 举报
回复
我不喜欢用inline副作用太多
  • 打赏
  • 举报
回复
即使不写inline,编译器也可能会内联的.
Jinhao 2009-05-01
  • 打赏
  • 举报
回复
只要这个函数足够简单,满足优化条件,编译器就会优化inline

inline add(int a, int b)
{
return a + b;
}

inline add(int a, int b)
{
int i = a;
i += 5;
  i += 5;
  i += 5;
return a + b;
}
以上两种都会被优化。

inline sum(unsigned a)
{
if(a > 0)
return a + sum(a - 1);
else
return 0;
}

递归肯定不会被优化。
blacksky3 2009-05-01
  • 打赏
  • 举报
回复
看反汇编用指针操作都会有call,换成具体对象操作就没了
blacksky3 2009-05-01
  • 打赏
  • 举报
回复
其实我只想证明下,大多时候用指针或引用操作函数,内联将不再有效...
tjuxiaoqiang 2009-05-01
  • 打赏
  • 举报
回复
inline 和 virtual 可以一起使用,但一起使用时inline将失去作用,因为inline像register一样只是建议,并没有强制编译器把inline函数一定设置为内联函数。
wolflion 2009-05-01
  • 打赏
  • 举报
回复
根据编译器的吧。

lpf000 2009-05-01
  • 打赏
  • 举报
回复
用了inline的函数 复杂了 编译器不会做为内联函数
Paradin 2009-05-01
  • 打赏
  • 举报
回复
人也在研究见到漂亮女人就激动地具体过程
光宇广贞 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jackzhhuang 的回复:]
和编译器有关,标准只是模糊的说——只要函数足够简单,就会被优化。所以可以肯定,函数很复杂的话,肯定不会被优化。
[/Quote]

VC里面你启用/o1选项的话,那么只要你申请inline,哪怕是一个无限迭代函数,编译器也会给你全部inline的……这个才叫真的牛X的
jackzhhuang 2009-05-01
  • 打赏
  • 举报
回复
和编译器有关,标准只是模糊的说——只要函数足够简单,就会被优化。所以可以肯定,函数很复杂的话,肯定不会被优化。
Jinhao 2009-05-01
  • 打赏
  • 举报
回复
很多人也就写写代码,不过也没写出什么名堂来,甚至有人自诩拿着C++写了百万的代码,却义无反顾地说virtual函数会影响效率,我想那种代码必定会有众多的if和switch。
自认强大的人,总有一个信条,C++的东西到头来都是内存而已,能承认的是,这人肯定用过C或汇编,但是他忽略了一样东西。人都是碳水化合物,那为啥男人见到漂亮女人就会激动,女人见到漂亮男人就会兴奋?
语言的设计并不是提供语法糖这么简单,C/Pascal对汇编来说,它描述了一种机器模型,而其他语言,比如C++/Java是描述了一种问题的模型,让你从问题的抽象中去解决问题。
加载更多回复(1)

64,682

社区成员

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

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