C++灵巧计数器技术

阅读《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
请按任意键继续…

注:以上纯属个人理解,望指正。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值