一、单例模式的改进
之前实现了一个单例模式这里,这个单例模式的问题是构造的对象在程序退出时无法释放。我们使用了两种方法解决这个问题。第一:使用静态内部类对象,利用对象的确定性析构原理,在成员对象析构的时候释放外部类对象。第二:直接返回静态类对象。显然第一种方法不够简洁,而且这两种方法都使用了静态类对象,所以不是线程安全的。这里我们用智能指针auto_ptr改进单例模式。(注:auto_ptr在C++11标准中已经废弃;这个单例模式也不是线程安全的,这个例子仅仅为了演示auto_ptr用法)
示例:
#include <iostream>
#include <memory>
using namespace std;
class Singleton
{
public:
static Singleton* GetInstance()
{
//返回指针,但是不释放所有权
if (instacne_.get() == NULL)
{
instacne_ = auto_ptr<Singleton>(new Singleton);
}
return instacne_.get();
}
~Singleton()
{
cout<<"~Singleton ..."<<endl;
}
private:
// 禁止拷贝
Singleton(const Singleton& other);
Singleton& operator=(const Singleton& other);
// 将构造函数说明为私有的
Singleton()
{
cout<<"Singleton ..."<<endl;
}
static auto_ptr<Singleton> instacne_;
};
auto_ptr<Singleton> Singleton::instacne_;
int main(void)
{
Singleton* s1 = Singleton::GetInstance();
Singleton* s2 = Singleton::GetInstance();
return 0;
}
二、自己实现sizeof,align
sizeof的实现原理:1、对于变量,变量指针的偏移值等于变量的大小 2、对于类型,可将这个类型的指针放在0地址处然后偏移一个单位。则此时指针的地址即是类型大小。
align实现原理:通过加上对齐数-1向上对齐,然后低位置零保证是对齐数的倍数
示例:
#include <iostream>
using namespace std;
//两个指针相减,得到的是相隔几个元素
#define sizeof_v(x) (char*)(&x+1) - (char*)(&x)
#define sizeof_t(t) ((size_t)((t*)0 + 1))
//对齐
#define ALIGN(v, b) ((v+b-1) & ~(b-1))
class Empty
{
};
int main(void)
{
Empty e;
int n;
//cout<<sizeof(e)<<endl;
//cout<<sizeof(Empty)<<endl;
cout<<sizeof_v(e)<<endl;
cout<<sizeof_v(n)<<endl;
cout<<sizeof_t(Empty)<<endl;
cout<<sizeof_t(int)<<endl;
cout<<ALIGN(3, 16)<<endl;
cout<<ALIGN(31,16)<<endl;
cout<<ALIGN(0, 16)<<endl;
cout<<ALIGN(4198, 4096)<<endl;
return 0;
}