c++很奇怪的有关问题,请各位指教!
c++很奇怪的问题,请各位指教!!
//=======================================
//内联性能测试
//=========================================
#include <iostream>
#include <ctime>
using namespace std;
//------------------------------------------
int calc1 (int a, int b)
{
return a+b;
}
//------------------------------------------
inline int calc2 (int a, int b)
{
return a+b;
}
//-----------------------------------------
int main()
{
int x[300], y[300], z[300];
clock_t t = clock();
for(int i=0; i <300; ++i)
for(int j=0; j <300; ++j)
for(int k=0; k <300; ++k)
z[i] = calc1(x[j], y[k]);
cout < < "Not using inline: " < < (clock()-t)/CLK_TCK < < "seconds " < < endl;
t = clock();
for(int i=0; i <300; ++i)//第25行
for(int j=0; j <300; ++j)
for(int k=0; k <300; ++k)
z[i] = calc2(x[j], y[k]);
cout < < "Using inline: " < < (clock()-t)/CLK_TCK < < "seconds " < < endl;
return 0;
}
//===============================================================
错误提示:
第25行处,i重复定义 ,第26,27行的j,k没有提示出错呢,只有i提示重复定义
请问是什么原因?是编译器的问题吗?vc6
------解决方案--------------------
VC6啊,换VC7以上或者devcpp。
------解决方案--------------------
在VS2005下没问题呀,
Not using inline:2seconds
Using inline:2seconds
------解决方案--------------------
vc6是这样解释的
int i=0;
for(; i <300; ++i)
{
int j=0;
for(; j <300; ++j)
{
int k=0;
for(; k <300; ++k)
z[i] = calc1(x[j], y[k]);
}
}
------解决方案--------------------
因为j,k是在i的循环里面,所以不会出错
------解决方案--------------------
i当然出现了重复定义,而j和k由于作用域的问题不会产生重复定义
其他的编译器就不知道了
------解决方案--------------------
这个是VC6编译器的问题,按照标准,这样是可以的
没有办法,你用VC6,就得稍微向它妥协
------解决方案--------------------
vc6不够标准,标准要求for里面的变量在for结束后作用域就结束了。vc6认为仍然可见的
------解决方案--------------------
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
------解决方案--------------------
我在vc7.0中运行的时候没有错误,可能就是6.0的问题
--------------------
Vc7中有编译选项的,你打开的话结果与6中一样。
------解决方案--------------------
//=======================================
//内联性能测试
//=========================================
#include <iostream>
#include <ctime>
using namespace std;
//------------------------------------------
int calc1 (int a, int b)
{
return a+b;
}
//------------------------------------------
inline int calc2 (int a, int b)
{
return a+b;
}
//-----------------------------------------
int main()
{
int x[300], y[300], z[300];
clock_t t = clock();
for(int i=0; i <300; ++i)
for(int j=0; j <300; ++j)
for(int k=0; k <300; ++k)
z[i] = calc1(x[j], y[k]);
cout < < "Not using inline: " < < (clock()-t)/CLK_TCK < < "seconds " < < endl;
t = clock();
for(int i=0; i <300; ++i)//第25行
for(int j=0; j <300; ++j)
for(int k=0; k <300; ++k)
z[i] = calc2(x[j], y[k]);
cout < < "Using inline: " < < (clock()-t)/CLK_TCK < < "seconds " < < endl;
return 0;
}
//===============================================================
错误提示:
第25行处,i重复定义 ,第26,27行的j,k没有提示出错呢,只有i提示重复定义
请问是什么原因?是编译器的问题吗?vc6
------解决方案--------------------
VC6啊,换VC7以上或者devcpp。
------解决方案--------------------
在VS2005下没问题呀,
Not using inline:2seconds
Using inline:2seconds
------解决方案--------------------
vc6是这样解释的
int i=0;
for(; i <300; ++i)
{
int j=0;
for(; j <300; ++j)
{
int k=0;
for(; k <300; ++k)
z[i] = calc1(x[j], y[k]);
}
}
------解决方案--------------------
因为j,k是在i的循环里面,所以不会出错
------解决方案--------------------
i当然出现了重复定义,而j和k由于作用域的问题不会产生重复定义
其他的编译器就不知道了
------解决方案--------------------
这个是VC6编译器的问题,按照标准,这样是可以的
没有办法,你用VC6,就得稍微向它妥协
------解决方案--------------------
vc6不够标准,标准要求for里面的变量在for结束后作用域就结束了。vc6认为仍然可见的
------解决方案--------------------
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
------解决方案--------------------
我在vc7.0中运行的时候没有错误,可能就是6.0的问题
--------------------
Vc7中有编译选项的,你打开的话结果与6中一样。
------解决方案--------------------