`

C++函数中的静态变量

    博客分类:
  • C++
c++ 
阅读更多
在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++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...

    C++静态成员函数与静态成员变量小结

    7. 静态变量保存在全局数据区,而不是保存在栈中,只会初始化一次,每次的值保持到下一次调用,直到下次赋新值。 NON-STATIC成员是指没有加Static的成员,所有没有加Static的成员都是非静态成员。当类被实例化之后...

    构造函数与静态块的执行顺序

    静态块常用于初始化静态变量或执行一次性的初始化操作。 ### 继承中构造函数与静态块的执行顺序 在Java中,当一个类继承自另一个类时,实例化子类对象时构造函数与静态块的执行顺序遵循以下规则: 1. **静态块的...

    利用静态变量对函数访问次数计数.zip

    在C++或类似的编程语言中,静态变量有以下特点: 1. 生命周期:静态变量在整个程序运行期间只初始化一次,其生命周期从定义时开始,直到程序结束。 2. 存储位置:静态变量存储在内存的静态存储区,不同于栈上的局部...

    C++类中的静态成员变量和静态成员函数的作用

    ### C++类中的静态成员变量和静态成员函数的作用 #### 静态成员变量与静态成员函数概述 在C++编程语言中,类是面向对象编程的基础,它允许程序员定义包含数据成员(变量)和成员函数(方法)的复合数据类型。其中...

    CC++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

    - 设计和使用访问静态变量的函数时,需考虑重入问题,因为静态变量都位于静态数据存储区,全局可见。 - 需要一个可重入的函数时,应避免在函数中使用`static`变量,以免出现内部存储器问题。 - 当函数返回值为指针...

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...

    C++静态成员变量和静态成员函数

    静态成员变量和静态成员函数都是C++中非常有用的特性,它们可以帮助我们更有效地管理和组织代码。通过合理地利用这些特性,可以显著提高程序的性能并简化代码结构。无论是实现对象计数还是执行与类相关的操作,这些...

    C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf

    本文研究了C++ Hook(钩子)编程中,使类成员函数代替全局函数(静态函数)的技术。通过内联汇编,构造类对象独享的函数(委托),完成了类成员函数到普通全局函数的转化,并在Windows Hook(钩子)编程中得到成功的实践。...

    C++ 静态变量的使用,初学C++参考

    总结来说,静态变量在C++中提供了多种用途,如保存函数调用的计数、实现局部变量的持久化、封装全局变量以及在类中实现共享数据。理解并合理运用静态变量,对于编写高效且易于维护的代码至关重要。初学者应该通过...

    C++中类使用全局变量

    在C++编程语言中,全局变量是在程序的任何作用域之外声明的变量,可以在程序的多个函数或类中被访问。它们在整个程序的生命周期内都存在,从程序开始执行到结束时保持其值。全局变量的使用有其优点,如共享数据和...

    吕鑫:【C++语法与数据结构第06天】【第3堂课】静态成员变量与静态成员函数(面试题)

    1、讲解static静态局部变量的原理与特点; 2、讲解static静态全局变量的原理与特点; 3、讲解static静态成员变量的原理与特点; 4、讲解static静态成员函数的原理与特点;

    关于C++静态成员函数访问非静态成员变量的问题

    在C++编程语言中,静态成员函数和非静态成员函数有着显著的区别,这主要体现在它们的作用域、内存分配以及对对象状态的访问上。当我们讨论"关于C++静态成员函数访问非静态成员变量的问题"时,我们需要深入理解这两种...

    C++代码:使用静态局部变量统计函数被调用次数

    这个资源介绍了如何在C++编程中使用静态局部变量来统计函数被调用的次数。静态局部变量在函数内声明,但其生命周期贯穿整个程序运行过程,每次函数调用时,该变量不会被重新初始化。本文将详细解释静态局部变量的...

    c++ qt 静态函数中发信号

    本篇将详细介绍如何在C++ Qt的静态函数中发送信号以及回调函数的基本使用。 首先,理解Qt的信号与槽机制。信号是对象状态改变时的通知,而槽是响应这些通知的函数。当一个信号被发射,与其连接的槽函数会被调用。在...

    静态全局变量,静态局部变量,全局变量,局部变量

    - **静态变量**: 在程序多次调用过程中保持原有的赋值状态不变。 - **变量作用范围**: 通过`static`关键字限定变量的可见性范围。 - **静态存储方式**: 改变变量的存储位置,使之在整个程序运行期间都存在。 - **...

    C++静态成员函数不能调用非静态成员变量(详解)

    总结来说,C++中的静态成员函数不能调用非静态成员变量,主要是由于静态成员函数不与任何特定对象绑定,没有`this`指针,因此无法访问需要对象实例才能确定的非静态成员。要访问非静态成员变量,必须通过非静态成员...

    C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    局部变量适用于临时存储,全局变量用于在整个程序中需要共享的数据,局部静态变量用于在函数调用之间保持状态,而全局静态变量则提供了一种限制全局变量作用域的方法。在实际编程中,应谨慎使用全局变量,以避免潜在...

    C、C++函数辞典.chm

    《C、C++函数辞典》是一份宝贵的编程资源,主要涵盖了C和C++两种编程语言中的函数使用和解释。这份CHM( Compiled HTML Help)文件是程序员在学习和工作中查询函数用法的重要参考工具。下面,我们将深入探讨C和C++...

    C++ 静态成员变量 嵌套类分配回收内存

    在深入探讨"C++ 静态成员变量与嵌套类的内存分配回收"这一主题之前,我们首先需要理解几个核心概念:静态成员变量、嵌套类以及它们在内存管理中的角色。 ### C++中的静态成员变量 静态成员变量是类的一个特性,它...

Global site tag (gtag.js) - Google Analytics