注意!C++值传递对内存进行全拷贝!
很多刚学C++的程序员写代码时,不会特别注意函数参数的传递方式,对CString等类型参数会直接使用值传递的方式,下面我们通过一段代码验证下值传递对程序内存及性能的影响。
为了能直观的看到对比结果,我们分别以std::list和CSimpleArray举例,源代码及内存情况如下:
【std::list】
【CSimpleArray】
通过对比图可以看到,std::list在进入函数时会对list内所有节点进行全拷贝,内存直接增长一倍,同时由于内存拷贝需要消耗一定时间,进入函数时卡顿较长时间。
CSimpleArray经过了一定优化,首次进入函数时没有进行拷贝,读取也不会重新拷贝,但在写入值时,会进行拷贝。
通过上述代码可以看出,函数值拷贝会极大的占用内存,同时消耗性能,如果程序中存在大量值拷贝过程,程序的瞬时内存会非常大,同时程序执行效率会非常低。
总结
各位初学C++的小伙伴要注意了,熟练使用不同的传递方式是很重要的,同时,做程序性能优化时,可以首先检查函数的参数传递方式,说不定是一个无脑提高程序性能的一个方式。