的我具有可變長度數據結構,多維迭代:分配可變大小類
class Iterator
{
public:
static Iterator& init(int dim, int* sizes, void* mem)
{
return *(new (mem) Iterator(dim, sizes));
}
static size_t alloc_size(int dim)
{
return sizeof(Iterator) + sizeof(int) * 2 * dim;
}
void operator++()
{
// increment counters, update pos_ and done_
}
bool done() const { return done_; }
bool pos() const { return pos_; }
private:
Iterator(int dim, int* sizes) : dim_(dim), pos_(0), done_(false)
{
for (int i=0; i<dim_; ++i) size(i) = sizes[i];
for (int i=0; i<dim_; ++i) counter(i) = 0;
}
int dim_;
int pos_;
bool done_;
int size (int i) { return reinterpret_cast<int*>(this+1)[i]; }
int& counter(int i) { return reinterpret_cast<int*>(this+1)[dim_+i]; }
};
迭代器的維度不是在編譯時已知的,但是可能是小的,所以我分配內存迭代器與alloca
:
void* mem = alloca(Iterator::alloc_size(dim));
for (Iterator& i = Iterator::create(dim, sizes, mem); !i.done(); ++i)
{
// do something with i.pos()
}
是否有迭代分配內存的更優雅的方式?我知道這樣的事實,即從函數返回時,其堆棧被解除,因此alloca
必須用於調用者的堆棧幀(請參閱,例如here)。這answer表明,分配在默認參數下進行:
static Iterator& init(int dim, int* sizes, void* mem = alloca(alloc_size(dim)));
然而優雅,這種解決方案並不能幫助我:Default argument references parameter 'dim'
。任何建議一個很好的解決方案?
您可以使用宏。 – 2012-07-20 11:30:25
我的眼睛在看着這個傷害。看起來像無限遞歸的混合('bool done()const {return done();}')具有未定義的行爲。 – 2012-07-20 11:41:00
@TadeuszKopec:呵呵吧,對不起:)我的意思是'done_'當然。糾正它。 – marton78 2012-07-20 12:27:10