VC编程零散笔记集锦

============================【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?)

错误分析:

函数定义时,首行多加了分号,去掉在第一行末尾的分号即可。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值