c++中的new操作符有一种用法叫做定位(placement new)
这种用法预先分配了内存,要创建一个对象时,直接把对象分配到这块内存上,节省了创建时间。
这种用法很好,但是在实际的运用的很少见。今天在一个stack的实现里看到了这种用法,觉得用的很合适。
可见在初始化的时候就分配了预先设定的空间,当要向栈里面压入数据时使用的是Push函数
他的实现是这样的
用法如下:
class A;
char* area = new char[sizeof(A)];
A *a = new (area) A(1);
delete a;
这种用法预先分配了内存,要创建一个对象时,直接把对象分配到这块内存上,节省了创建时间。
这种用法很好,但是在实际的运用的很少见。今天在一个stack的实现里看到了这种用法,觉得用的很合适。
该类是一个模板类
template<typename T> class Stack;
他的构造函数是这样的
template<typename T> Stack<T>::Stack(unsigned maxSize) :
maxSize_(maxSize),
top_(0)
{
buffer_ = static_cast<T*>(std::malloc(maxSize_ * sizeof(T)));
}
可见在初始化的时候就分配了预先设定的空间,当要向栈里面压入数据时使用的是Push函数
他的实现是这样的
template<typename T> inline void Stack<T>::Push(const T& newEntry)
{
new (&buffer_[top_++]) T(newEntry);
}
使用的就是new的定位用法了,这样的实现很优雅
出栈函数
template<typename T> inline void Stack<T>::Pop()
{
(&buffer_[--top_])->~T();
}