C++内联函数的执行效率

光辉岁月Ivy 2015-01-24 02:44:02
最近学习了哈Thinking C++的内联函数,想编程对比一哈内联函数的效率(执行时间),函数如下:
#define Add(X) ((X)+1)
inline int Add1(int X)
{
return X + 1
};
int Add2(int X)
{
return X + 1
}
测试程序:

//计时1:
for(int i = 0;i < 10000000; i++)
{
//分别调用Add,Add1,Add2
}
计时2

测试环境是win7下面的VS2010,然后发现Add时间很短,但是Add1和Add2都很长并且时间差不多,这个内联是不是没有效果?为什么?
...全文
530 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-01-27
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
crazylevel 2015-01-27
  • 打赏
  • 举报
回复
define是预编译器把你的宏直接替换成你预定义的内容,而inline不一样,有时候看你的编译器行为,在你的代码里使用的是一个循环,当内联函数在你的循环中展开时,编译器的判断是不同意的,因为这样的代码膨胀的太厉害了,上面有人说的一点,内联是一个建议,当编译器觉得你内联代价太大时他就会忽略掉你的内联声明。 不是什么地方都要使用内联的,你要知道他带来了速率的上升必定带有一定的副作用,就是空间的牺牲,你可以看一下effect C++,里面有关于这方面的说明。
光辉岁月Ivy 2015-01-27
  • 打赏
  • 举报
回复
@ri_aje...应该是你说的问题...debug下面测试内联inline确实没得什么效果...release下面就比较明显了,和#define差不多的时间 并且好像我这个用inline修饰的和没得inline修饰的都被优化成了内联函数?时间也很接近 结果是debug下:inline和没得inline修饰的比#define定义的差很远 而release下面差不多 另外问一哈呢...debug下面我可以查看汇编,release下面怎么看呢?
yshuise 2015-01-25
  • 打赏
  • 举报
回复
整一个复杂的for循环就知道inline的作用了!
FancyMouse 2015-01-25
  • 打赏
  • 举报
回复
要看汇编开/FA
ri_aje 2015-01-25
  • 打赏
  • 举报
回复
c++要测效率都得开优化 (release),debug 下测效率就是自娱自乐浪费时间。
砖家的谎言 2015-01-25
  • 打赏
  • 举报
回复
debug和release啥关系
paschen 版主 2015-01-25
  • 打赏
  • 举报
回复
感觉release下,如果像这样的代码也会被优化成内联的
bear234 2015-01-24
  • 打赏
  • 举报
回复
内联必须写在头文件里,也不是必须啦,但最好这样做 或者你这样: 你把add2的声明写到一个头文件里,然后其定义写到另一个文件里 然后你把add1的定义写到add2声明的同一个文件里 然后让main函数include这个头文件 然后在main里做测试 我相信会有效果的 调用普通函数浪费时间是因为要寻址开栈 如果你把普通函数的定义和main函数写到一个文件里,可能会执行快一点 事实上,内联函数就要求:凡是调用过该内联函数的文件,必须出现该内联函数的定义-----这也就是为什么内联函数强烈推荐直接写到头文件里的原因~~~ 而如果你把普通函数也像内联那样和主函数定义到一个文件里,这样会节约一点调用普通函数的时间 所以我觉得你可以试试把你的普通函数的定义写到另外一个文件里 如果你对我上面说的东西有困惑,自己去看c++ primer 吧..........
mujiok2003 2015-01-24
  • 打赏
  • 举报
回复
引用 7 楼 thtianhui123 的回复:
看了汇编,貌似确实是debug下自己定义的内联函数没有内联成功,需要什么条件吗
换release版。 inline的目的就是建议编译器优化,而你选择的debug版却要求编译器不要优化, 最终建议屈服于要求
光辉岁月Ivy 2015-01-24
  • 打赏
  • 举报
回复
额...刚才看了哈网上开启内联函数的方法..只有VC6.0的,VS2010怎么开启呢
光辉岁月Ivy 2015-01-24
  • 打赏
  • 举报
回复
看了汇编,貌似确实是debug下自己定义的内联函数没有内联成功,需要什么条件吗
帅得不敢出门 2015-01-24
  • 打赏
  • 举报
回复
引用 4 楼 thtianhui123 的回复:
thinking in C++说的"我们必须理解内联仅是编译器的一个建议,编译器不强迫内联任何代码",怎么判断是否内联了呢?
看汇编。看是否有函数栈的push pop
碼上道 2015-01-24
  • 打赏
  • 举报
回复
可以看反汇编是否内联,debug版本有可能没有内联成功。
光辉岁月Ivy 2015-01-24
  • 打赏
  • 举报
回复
thinking in C++说的"我们必须理解内联仅是编译器的一个建议,编译器不强迫内联任何代码",怎么判断是否内联了呢?
光辉岁月Ivy 2015-01-24
  • 打赏
  • 举报
回复
这个和release版本和debug版本有关系吗? inline不是本身就是#define功能类似?貌似我这个是虽然有inline修饰了这个函数,但是这个关键字没有起作用一样...这个就不知道原因了... thinking in c++里面只说了有两种编译器不能处理内联的情况,并且她测试内联的例子都是和我差不多,我上面的例子内联应该能生效才是啊
光辉岁月Ivy 2015-01-24
  • 打赏
  • 举报
回复
额..目前是在debug版本下面测试的...但是我看了哈debug和release版本下面都没得asm文件
relaxisland 2015-01-24
  • 打赏
  • 举报
回复
是release版本吗? 你可以看看编译出来的asm文件 在release版本 #define Add(X) ((X)+1) 本身很可能会被优化掉的 因为这个代码基本没有任何意义

64,654

社区成员

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

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