????Nifty counter.
???????????????????? Nifty counter?? ???? GCC ??????????????[3]????????????????????????????? x?? Nifty counter ???????????????????????????????? x ????????????? static ?????????????? static ????????????????????????????????????? x?????????????????????? x????????£?
// global.h
#ifndef _global_h_
#define _global_h_
extern X x;
class initializer
{
public:
initializer()
{
if (s_counter_++ == 0) init();
}
~initializer()
{
if (--s_counter_ == 0) clean();
}
private:
void init();
void clean();
static int s_counter_;
};
static initializer s_init_val;
#endif
????? cpp ?????
// global.cpp
#include "global.h"
static X x;
int initializer::s_counter_ = 0;
void initializer::init()
{
new(&x) X;
}
void initializer::clean()
{
(&x)->~X();
}
????????????????????????? x ????????????? global.h ???????????????????????????????????? initializer ??????????????? s_init_val?? ????????????????????????????????????????????? s_init_val?????????????? s_init_val ????????????? x ????????????????????? s_init_val ????????????? x ?????????????? initializer ?????????????????? s_counter_ ????????????????????????????????????
????????? x ????? placement new ???????????????????????????????????????????????δ??????????????Щ???????????????????????????Щ??????????
???????????? x ???????????????????????????????init() ????????? x ??????????? x ????????????x ??????????????????Σ???? x ??????????????????Σ??????????????????????????????? x ????????
// global.cpp
#include "global.h"
static char g_dummy[sizeof(X)];
static X& x = reinterpret_cast<X&>(g_dummy);
int initializer::s_counter_ = 0;
void initializer::init()
{
new(&x) X;
}
void initializer::clean()
{
(&x)->~X();
}
???????? static X& x = reinterpret_cast<X&>(g_dummy); ??????????????????? g_dummy ??????????????? x ???????????????????????????????????????? x ????????????????????????????????????????????????????????????????????? ?????????????????????????????????????? x ???????? include ???? global.h????????????????? y ?????????????????????? x?? ???????????????????? foo???? foo ???????? x?????????????????? y ????????????????????? x???????п?????? include ???? global.h????? y ?????????п????? x ????????
????????????? gcc c++ ???????????е????????????????????????????