我们知道要了解编译器在做什么,NRV优化应该是一个无法避免的问题,下面来看一个例子
#include "iostream" //从这两个程序的运行来看NRV优化好像并不是那么如你想象中的好
using namespace std;
#include <time.h>
class text
{
friend text foo(double);
public :
text()
{
memset(arry,0,100*sizeof(double));
}
private :
double arry[100];
};
text foo(double var)
{
text local;
local.arry[0]=var;
local.arry[99]=var;
return local;
}
void printlocaltime(void)
{
struct tm *timeptr;
time_t secsnow;
time(&secsnow);
timeptr=localtime(&secsnow);
printf("the local time is %d-5d-20%02d\n",
(timeptr->tm_mon)+1,
((timeptr->tm_mday)),
(timeptr->tm_year));
printf("localtime is %02d:%02d:%02d\n",
timeptr->tm_hour,
timeptr->tm_min,
timeptr->tm_sec);
}
int main()
{
printlocaltime();
for(int cnt=0;cnt<10000000;cnt++)
{
text t=foo(double (cnt)); //在不使用内联拷贝时程序用了5s时间
} //使用内联拷贝时程序用了6s时间
printlocaltime(); //为什么没有像预想的那样发生NRV优化呢
return 0;
}
这个程序的运行时间为5s
现在来看增加内联函数而激活NRV优化之后的程序
#include "iostream" //从这两个程序的运行来看NRV优化好像并不是那么如你想象中的好
using namespace std;
#include <time.h>
class text
{
friend text foo(double);
public :
inline text(const text &t);
text()
{
memset(arry,0,100*sizeof(double));
}
private :
double arry[100];
};
text foo(double var)
{
text local;
local.arry[0]=var;
local.arry[99]=var;
return local;
}
inline text::text(const text &t)
{
memcpy(this,&t,sizeof(text));
}
void printlocaltime(void)
{
struct tm *timeptr;
time_t secsnow;
time(&secsnow);
timeptr=localtime(&secsnow);
printf("the local time is %d-5d-20%02d\n",
(timeptr->tm_mon)+1,
((timeptr->tm_mday)),
(timeptr->tm_year));
printf("localtime is %02d:%02d:%02d\n",
timeptr->tm_hour,
timeptr->tm_min,
timeptr->tm_sec);
}
int main()
{
printlocaltime();
for(int cnt=0;cnt<10000000;cnt++)
{
text t=foo(double (cnt)); //在不使用内联拷贝时程序用了5s时间
} //使用内联拷贝时程序用了6s时间
printlocaltime(); //为什么没有像预想的那样发生NRV优化呢
return 0;
}
运行时间长达6s或者7s或者更长,为什么会出现这种情况,优化之后的运行负担好像是加重了