C++灵巧计数器技术

原创 2016年01月08日 15:31:18

阅读《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++实现“简单计算器”

C++实现“简单计算器”。
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016年05月14日 13:34
  • 5673

C++ 引用计数器

今天讲一个实用的东西,C++类的引用计数,不废话直接上代码;#ifdef WIN32 #include #else #include #endif using namespace std; cl...
  • I_can_do_1098
  • I_can_do_1098
  • 2016年12月14日 17:16
  • 232

c++实现简单计算器

帮一个同学写的,非计算机类专业,应付交差,也没什么功能,两个数的加减乘除运算,以及三角函数的运算。要求用到模板、运算符重载和异常处理。 一直以来都是用的java,没怎么用过c++,就当是复习了一...
  • u013805360
  • u013805360
  • 2015年06月06日 18:32
  • 5207

C++对象计数

对象计数是C++中一种常见的技术,在-x引擎中也封装了很多对象计数的方法,这里是查阅了相关资料后对常见的对象计数方法进行总结。一个比较简单的单类的计数就是:class Sprite { public:...
  • John_cdy
  • John_cdy
  • 2015年06月02日 09:45
  • 1564

c++跨平台计数器

跨平台计数器,在Win10和CentOS7下测试通过,用来度量程序的时间性能。...
  • lee353086
  • lee353086
  • 2016年03月17日 11:04
  • 510

低门槛入门——图灵机器人开发

实现圆形头像、实现listview多布局适配优化....图灵机器人示范
  • u010794180
  • u010794180
  • 2015年07月20日 16:04
  • 2313

唐巧总结的40个国人iOS技术博客

更新地址 https://github.com/tangqiaoboy/iOSBlogCN 博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 破船之家...
  • ruglcc
  • ruglcc
  • 2015年11月21日 20:06
  • 25114

常见的几种vs2012调试技巧

转自:http://www.cnblogs.com/lazycoding/archive/2012/10/03/2710738.html 介绍 调试是软件开发周期中的一个很重要的部分,...
  • lynnucas
  • lynnucas
  • 2016年05月03日 14:41
  • 4556

More Effective C++----(28)灵巧(smart)指针

Item M28:灵巧(smart)指针
  • qianqin_2014
  • qianqin_2014
  • 2016年05月07日 15:50
  • 812

C++灵巧指针

template class SmartPtrToConst { //这个类作为基类而存在,为了实现从const smart pointer 到smart pointer的转换 .... prot...
  • vicagogo
  • vicagogo
  • 2014年03月11日 15:42
  • 386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++灵巧计数器技术
举报原因:
原因补充:

(最多只允许输入30个字)