class CBase
{
public
CBase(int n){ n = m_n;}
int m_n;
}
dtNavMeshQuery* dtAllocNavMeshQuery()
{
void* mem = dtAlloc(sizeof(dtNavMeshQuery), DT_ALLOC_PERM);
if (!mem) return 0;
return new(mem) dtNavMeshQuery;----调用后面类的默认构造函数生成对象并且填充内存
}---这块是在看navmesh的时候发现也由此优雅的写法。
void* memPoint = new char[sizeof(CBase)];
CBase *p = new (memPoint) CBase(1);
delete p;
这种用法预先分配了内存,要创建一个对象时,直接把对象分配到这块内存上,节省了创建时间。
这种用法很好,但是在实际的运用的很少见。今天在一个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();