VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 698|回复: 4

一个测试内联的例子的问题,望各位来帮帮忙~谢谢

[复制链接]

3

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-25 17:00:01 | 显示全部楼层 |阅读模式
钱能的C++里有这样一个内联函数的例子:
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
int calc1(int x,int y){ return x+y;}
inline int calc2(int x,int y){return x+y;}
main()
{int x[1000],y[1000],z[1000];
clock_t t=clock();
for(int i=0;i<1000;i++)
  for(int j=0;j<1000;j++)
   for(int k=0;k<1000;k++)
     z[i]=calc1(x[j],y[k]);
cout<<"NOT USING INLINE:"<<(clock()-t)/CLK_TCK<<"seconds\n";
   t=clock();
    for(int i=0;i<1000;i++)
     for(int j=0;j<1000;j++)
      for(int k=0;k<1000;k++)
       z[i]=calc2(x[j],y[k]);
cout<<"USING INLINE:"<<(clock()-t)/CLK_TCK<<"seconds\n";         
getchar();
}

书上得的结果是没有内联的函数是8.281秒
有内联的函数是2.437秒.
我的机器得出的两个函数全是10秒,晕死我了
谁能帮我解决一下啊...先谢谢拉.
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-2-15 09:30:01 | 显示全部楼层
不会的编译器,不同的编译选项,结果是会不一样的,这有什么好晕的。
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-2-15 23:00:01 | 显示全部楼层
如果加上了优化,有可能你的那个函数会被自动变成内联

所以你可以尝试直接使用没有加优化的编译命令,也不要加调试信息,
再运行可能会有不一样的结果

--恕我直言,要排除所有编译器的优化有时候不太容易,但内联是否真正内联,
在很多编译器都是可以由你自己控制的,除非你的内联实在不合理

(一个例子是,如果你的内联是一个递归函数,那么当递归到一定程度以后,
或者说递归层数超过了限制,那么编译器还是使用非内联的办法,避免二进制代码的无节制膨胀)

回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-2-16 00:30:02 | 显示全部楼层
说的有些偏题,你的问题可能就是一句话:虽然你写的是非内联的函数,但
编译器觉得,你的那个非内联函数足够简单,所以也给当作内联处理掉了

因此你要做的只是,告诉编译器,别随便内联,按我说的作!!
比如vc的编译器,你可以用这样的编译命令行
cl /EHsc /Ob1 a.cpp
回复

使用道具 举报

3

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-4-16 19:00:01 | 显示全部楼层
我用的是dev C++,没有用VC
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表