在C++中,可以在成员函数中使用静态变量,从而间接达到在hpp中定义属于某个类的静态变量的目的(无需再在cpp文件中初始化)
然而,这中方案在速度上会有一定的损耗。
1、该变量首次使用时才进行初始化
When do function-level static variables get allocated/initialized?:
https://stackoverflow.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://stackoverflow.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++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...
对C++静态成员函数和静态成员变量的使用方法和内部机制进行的经验总结
C++静态成员变量和静态成员函数C++静态成员变量和静态成员函数
描述继承中子类与父类构造函数,静态块的执行顺序
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...
C++类中的静态成员变量和静态成员函数的作用
1、讲解static静态局部变量的原理与特点; 2、讲解static静态全局变量的原理与特点; 3、讲解static静态成员变量的原理与特点; 4、讲解static静态成员函数的原理与特点;
根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从...
静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。该变量在全局数据区内分配内存;静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行...
静态数据成员是类的一部分,在产生任何实例之前已经存在,通过类名::静态成员变量名访问。 函数成员(都在代码区): 静态函数成员与非静态函数成员都为类所有,对象并不存在函数的拷贝。静态成员函数和非静态成员函数...
虚拟函数是C++语言引入的一个很重要的特性,它提供了“动态绑定”机制,正是这一机制使得继承的语义变得相对明晰。 (1)基类抽象了通用的数据及操作,就数据而言,如果该数据成员在各派生类中都需要用到,那么就...
C++中 静态局部变量实例详解 以前经常使用和了解static作用在全局变量前,以至于甚至把static当做全局变量的代名词,但是其实static还可以作用于局部变量前 静态局部变量的意义: 1.分配空间在全局数据栈上 2.作用...
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放。 4、...
静态成员变量是一个在c++中应用很广泛的函数 解决了很多问题
原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非...
C++中静态成员函数访问非静态成员的实例 实现代码: #include /* 静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可...
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是...