欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++函数中的静态变量

程序员文章站 2022-06-03 22:24:55
...
在C++中,可以在成员函数中使用静态变量,从而间接达到在hpp中定义属于某个类的静态变量的目的(无需再在cpp文件中初始化)
然而,这中方案在速度上会有一定的损耗。
1、该变量首次使用时才进行初始化
When do function-level static variables get allocated/initialized?:https://*.com/questions/55510/when-do-function-level-static-variables-get-allocated-initialized

2、每次使用都多出一个if语句及atomic操作(为了多线程安全性)

Does a function local static variable automatically incur a branch?https://*.com/questions/23829389/does-a-function-local-static-variable-automatically-incur-a-branch


速度对比:
单线程调用1亿次,慢14ms左右
  • static var use: 43ms
  • static method var use: 67ms

class TestStatic{
public:
	static std::vector<int> v;

	inline static std::vector<int>& mv(){
		static std::vector<int> v;
		return v;
	}
};
std::vector<int> TestStatic::v;

void testStatic(){
	int n=10000000;
	int r=0;
	int r2=0;

	TestStatic::v.push_back(0);
	TestStatic::mv().push_back(0);

	LC::TimerAccurate timer;
	for (int i=0;i<n;++i){
		r+=TestStatic::v.size();
//		TestStatic::v[0]++;
	}
	std::cout<<"static var use: \t"<<timer.getElapsedTime_in_ms()<<"ms"<<std::endl;
	timer.restart();

	for (int i=0;i<n;++i){
		r2+=TestStatic::mv().size();
//		TestStatic::mv()[0]++;
	}
	std::cout<<"static method var use: \t"<<timer.getElapsedTime_in_ms()<<"ms"<<std::endl;
	timer.restart();

	std::cout<<r<<std::endl;
	std::cout<<r2<<std::endl;

	std::cout << "End of test, " << __FUNCTION__ << std::endl;
	exit(0);
}
相关标签: c++