C++灵巧计数器技术
来源:互联网 发布:diy手机墙纸软件 编辑:程序博客网 时间:2024/04/29 19:46
阅读《large_scale_cpp_software_design》一书中灵巧计数器技术。该技术主要是针对非局部静态对象的静态对象成员的初始化。我们知道,非局部静态变量(即全局)是在程序启动前初始化,也就是在程序启动到进入main()之前,而局部静态对象,例如函数中的静态变量,对象的静态成员则是在使用时初始化。也就是说在程序启动时,非局部的静态对象初始化时并没有对其静态成员对象进行初始化。所以灵巧计数器的目的就是保证在非局部静态对象初始化之前,该对象的静态成员对象能被正确的初始化,然后程序结束时,静态成员对象能正确的被清理。
具体做法如下:
1.在非局部静态对象类的声明头文件中定义个静态的伪对象。
#ifndef __TEST__H__#define __TEST__H__#include <iostream>using namespace std;class PublicList{public: PublicList() { cout << "PublicList()" << endl; } ~PublicList() { cout << "~PublicList()" << endl; }public: static int m_staticParam;};struct tagPublicInit{ tagPublicInit(); ~tagPublicInit();};static tagPublicInit PublicInit;#endif
实现如下:
#include "stdafx.h"#include "Test.h"static int nCount = 0;int PublicList::m_staticParam = -1;tagPublicInit::tagPublicInit(){ nCount++; cout << "tagPublicInit():nCount" << " " <<nCount << endl; PublicList::m_staticParam = 1; cout << "tagPublicInit():m_staticParam" << " " << PublicList::m_staticParam << endl;}tagPublicInit::~tagPublicInit(){ nCount--; cout << "~tagPublicInit():nCount" << " " << nCount << endl; if (nCount == 0) { PublicList::m_staticParam = 0; cout << "~tagPublicInit():m_staticParam" << " " << PublicList::m_staticParam << endl; }}
所以当每次有cpp文件包含一次这个头文件时,在程序启动时,计数器nCount会加1.
然后当程序退出时。每个编译单元就会清理tagPublicInit对象,然后对计数器减一。当所有的包含该头文件的单元完成清理后,nCount变为0,然后对非局部的对象完成清理。
2.main.cpp
#include "stdafx.h"#include "Test.h"static PublicList gList;int _tmain(int argc, _TCHAR* argv[]){ return 0;}
3.程序运行结果
tagPublicInit():nCount 1
tagPublicInit():m_staticParam 1
tagPublicInit():nCount 2
tagPublicInit():m_staticParam 1
PublicList()
~PublicList()
~tagPublicInit():nCount 1
~tagPublicInit():nCount 0
~tagPublicInit():m_staticParam 0
请按任意键继续…
注:以上纯属个人理解,望指正。
- C++灵巧计数器技术
- More Effective C++----(28)灵巧(smart)指针
- [C#]计数器
- Objective-C计数器疑问
- C语言中的简易计数器
- Objective-C - 自动引用计数器
- 【C++】引用计数器简单示例
- 【C++】万年历(时间计数器)
- 【C++】万年历(时间计数器)
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 计数器
- 嵌入式linux中YUV转换成RGB算法
- Android窗口抖动之动画实现
- pig安装和使用
- 同学大神写的很棒的C/C++的Matrix库函数~~力荐
- leetcode之Intersection of Two Linked Lists
- C++灵巧计数器技术
- 事务的原子性
- 基础回顾之DateFormater
- The Apache Tomcat Connectors - AJP Protocol Reference
- java中int和integer,String,StringBuffer,StringBuilder的区别
- mongodb 基于地理位置的查询
- HTTP协议小结
- 网站绑定域名后不能用IP直接访问了?
- ajax技术如何解决浏览器前进后退按键失效的问题