可变大小类的分配
Allocation of variable-sized class
我有一个可变长度的数据结构,一个多维迭代器:
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
(例如,请参见此处)。这个答案建议在默认参数中执行分配:
static Iterator& init(int dim, int* sizes, void* mem = alloca(alloc_size(dim)));
无论多么优雅,这个解决方案对我都没有帮助:Default argument references parameter 'dim'
。有什么好的解决方案的建议吗?
不幸的是,鉴于dim
是一个运行时值,除了使用宏之外,没有任何方法可以做到这一点
#define CREATE_ITERATOR(dim, sizes)
Iterator::init(dim, sizes, alloca(Iterator::alloc_size(dim)))
您可以将维度参数作为模板参数。
我的建议可能不是您想要的,但为什么不使用create|make_iterator函数来调用alloca呢?
我根本不建议使用alloca。如果dim值很小,那么类中的一些固定大小的缓冲区就足够了。如果dim很大,那么与迭代器上执行的其他操作的复杂性相比,堆分配成本可以忽略不计(请注意,对于非常大的dim值,alloca可能会导致堆栈溢出)。您可以在运行时在固定缓冲区和堆分配之间进行选择,具体取决于dim大小。
所以我建议使用类似于std::string中的小字符串优化的方法。
也许,某种COW(书面复印http://en.wikipedia.org/wiki/Copy-on-write)technique可能对迭代器也很有用。
请注意,此技术不能用于alloca,只能用于堆分配。此外,如果迭代器使用alloca(至少没有越来越多丑陋的宏),那么几乎不可能复制或复制初始化迭代器。
Alloca是邪恶的:)
相关文章:
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 分配抽象类类型 c++ xcode 的对象
- 使用类中的方法作为运算符将值分配给类的私有成员
- 如何根据基类对象中的变量值分配派生类中的变量?
- 为什么要返回对小类成员的 const 引用?
- 分配抽象类类型为"CObject"的对象
- 动态分配时类构造函数中的堆损坏
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 多维数组作为要在堆上分配的类成员
- C 中的Arduino类是否类似于处理中的最小类
- 对内存动态分配的类不使用"*"的逻辑
- 将指针作为参数分配给类变量,然后使用它抛出读取访问违规
- AVX2:分配给类成员时出现分段错误__m256i
- C++从 csv 文件中读取,然后将数据分配给类成员
- 将局部方法变量分配给类指针
- 移动构造函数和移动分配. 基类中的运算符
- 值不会分配给类中的变量
- 我想从文本文件中获取信息并将该信息分配给类对象
- 将值分配给类的私人成员变量
- 动态内存分配与类私有成员C++的 std::vector