============================【2012.10.10】=================================
主题:关于影响C++效能的那些操作
1.输入输出IO操作
代码举例如下:
void main()
{
double duration = 0.;
clock_t start=clock();
char a[] = "hello";
for (int i=0; i<10000; i++)
{
std::cout<<a;
}
duration = (double)(clock() - start) / CLOCKS_PER_SEC;
printf( "%average %2.1f FPS\n", i/duration );
}
运行结果显示:
也就是说,每次输出一个简单的长度为5的字符串,需要时间约为0.5ms。那么,如果不输出,而是简单的字符串赋值,结果怎样呢?
void main()
{
double duration = 0.;
char* a;
clock_t start=clock();
for (int i=0; i<100000000; i++)
{
a = "hello";
}
duration = (double)(clock() - start)/CLOCKS_PER_SEC ;
printf( "%average %2.1f FPS\n", duration );
}
这一次结果为:
注意,由于简单的赋值运算实在是快,只好将for循环次数变为1亿次,但是可以看到,所使用时间依然为0.
那么如果在循环内做个很简单的运算呢?
void main()
{
double duration = 0.;
char a[2];
clock_t start=clock();
for (int i=0; i<100000000; i++)
{
a[i%2]='f';
}
duration = (double)(clock() - start)/CLOCKS_PER_SEC ;
printf( "%average %2.3fs \n", duration );
}
结果为:
再进一步,如果调用函数呢?
void disp()
{
for (int i=0; i<2; i++)
{
;
}
}
void main()
{
double duration = 0.;
clock_t start=clock();
for (int i=0; i<50000000; i++)
{
disp();
}
duration = (double)(clock() - start)/CLOCKS_PER_SEC ;
printf( "%average %2.3fs \n", duration );
}
2.内存分配操作:new与malloc
void main()
{
double duration = 0.;
clock_t start=clock();
for (int i=0; i<1000000; i++)
{
int *p = new int[257];
delete[] p;
}
duration = (double)(clock() - start)/CLOCKS_PER_SEC ;
printf( "%average %2.3fs \n", duration );
}
结果为:
也就是说,使用new分配长度为257字节的内存重复一百万次,所用时间为6.641s;当然,每次分配的内存越大,所用时间一般来说也越多,因为要花时间去寻找和准备这样大的内存片,本人亲测分配大小为1M大小的内存一百万次,所用时间为12秒.
============================【2012.10.08】=================================
主题:关于warning LNK4089 /OPT:REF
转自:http://www.cnblogs.com/joeblackzqq/archive/2011/01/28/1947275.html
今天编译Relese版本项目是遇到【LINK : warning LNK4089: all references to "GDI32.dll" discarded by /OPT:REF】
这种警告解决办法:
1.Project--Setting--Link 选项卡,在Project Options 处添加 /opt:noref
2.Project--Setting--Link 选项卡,在Project Options 处添加 /IGNORE:4089
3.在程序中添加 #pragma warning(disable:4089)
注意:因为使用【/IGNORE:4089】生成的文件大小比【/opt:noref】小,个人推荐使用【/IGNORE:4089】在网上找到一些原因如下:
这个警告只是简单的意味你错误的连接一个库(library),编译器查到你并没有使用其中的函数.这个警告在你做发布版(release builds)的时候是很平常的,因为/OPT:REF的连接器选项在发布版本(release builds)被设置成为命令连接器修正你的最终代码尽可能的避免连接无用的dlls.(这使得可执行代码的import地址表尽量的小).
============================【2012.09.11】=================================
主题:变量使用时的提前声明
在同一个cpp文件中,为了突出main函数,或者其他原因,要把后来定义的某个变量提前使用,这就需要在本文件前面提前声明,如下式声明一个字符串数组,类似于带参数main函数中的argv变量。
声明:
extern const char* a[];
const char **b = a;
//。。。中间省略的很多代码
//文件的后面部分,变量的定义:
static const char* a[] = {"aa","bb","cc",0};
分析:变量a的声明处加了一个extern,这样编译器编译到这一行代码,就知道变量a是后来定义的,
而a的定义处前面加了static是为了防止其他程序使用,使a仅限于本文件使用。注意,在定义a时不管是否加了static,在提前使用声明时都不能加static,而是只能加extern 以及变量的类型,const是可以加的。
============================【2012.09.08】=================================
标题:关于操作符重载
C++ 的类中涉及到运算符重载的情况,规则为:将双目运算符函数重载为友元函数,将单目运算符函数重载为类的成员函数。
注:双目运算符:'+'、'-'、'*'、'/';单目运算符:'++'、'--'。
============================【2012.06】====================================
针对代码进行错误分析:
代码1:
int WriteImgInfo(const char* filename,IplImage* Img);
{
FILE* stream = fopen(filename,"w");
return 1;
}
错误提示:
error C2447: missing function header (old-style formal list?)
错误分析:
函数定义时,首行多加了分号,去掉在第一行末尾的分号即可。