社区
C++ 语言
帖子详情
inline函数的问题
blacksky3
2009-05-01 11:44:45
大家都知道inline其实是替代c里面函数宏,目的是为了减少调用的开销,但是inline具体在什么时候会变得无效,想请大家讨论下
我目前总结的是:
1.inline函数对于指针或者引用调用无效,因为只有在这种情况下编译期不能知道具体引用类型,和函数是否是virtual无关
...全文
238
21
打赏
收藏
inline函数的问题
大家都知道inline其实是替代c里面函数宏,目的是为了减少调用的开销,但是inline具体在什么时候会变得无效,想请大家讨论下 我目前总结的是: 1.inline函数对于指针或者引用调用无效,因为只有在这种情况下编译期不能知道具体引用类型,和函数是否是virtual无关
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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副作用太多
珍惜生命远离CPP
2009-05-01
打赏
举报
回复
即使不写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)
在JavaScript中使用
inline
函数
的
问题
前段时间被IE和JavaScript脚本引擎的Memory Leak
问题
弄得郁闷坏了,不过幸好现在总算是柳暗花明了,并且找到了一些IE中使用脚本避免ML
问题
的方法。继续研究JavaScript的编写,有发现一些不算ML
问题
,但是可以节约IE内存使用的方法,在此和大家讨论讨论。 我们在JavaScript中编写代码,对于定义
函数
的语句: fu...
关于__attribute__( ( always_
inline
) ) __STATIC_
INLINE
定义内联
函数
的一些
问题
最近移植软件,原编译器是GCC,移植到STM32上用ARMCC。 有几个库
函数
(htonl,ntohl,htons,ntohs)在标准库里没有,需要自己写。于是网上找了个模板比较简单,修改了下做成自己的
函数
。 然后想做成内联
函数
,于是加了__STATIC_
INLINE
(定义在core_cm4.h中)修饰。以htons为例,程序如下: // 模拟htons
函数
,本机字节序转网络字节序 __S...
小
问题
大思考之C++里的
inline
函数
inline
,一个神奇的关键字。有了它,
函数
,你同时就可以获取
函数
和宏的优点。
inline
定义的
函数
,比起没有
inline
的
函数
来说,没有执行
函数
调用所带来的负担(对此可参见《C++程序的内存布局》),因此它是高效率的;比起宏来,它具有
函数
的可预期行为和参数类型检验。宏的行为难于预期,我们看看下面这个宏定义 #define max(a, b) ( (a) > (b) ? (a) : (b)
inline
内联
函数
三个
问题
文章摘要: 内联
函数
定义位置:跨文件调用时必须在头文件中完整定义(声明+实现),单文件调用时可仅在.cpp中定义;无法实现"头文件声明+源文件实现"的合法跨文件内联。
C++ 类声明
inline
成员
函数
和
inline
成员
函数
定义
问题
C++ 类声明
inline
成员
函数
和
inline
成员
函数
定义 分别在头文件和实现文件中,加
inline
关键字,会产生链接link错误, 不知道以前版本的C++编译器怎么样,但碰到的最新的编译器都是这样的。 这些表明,
inline
类成员
函数
不能分为声明和实现,最好就内部(头文件)实现就好, 不要分开实现,要么就不要加
inline
。 xx.h class A{
inline
void f(); }; xx.cpp
inline
void A::f(){} 这是错误的,不管都加
inline
,还.
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章