【发布时间】:2013-11-26 23:29:02
【问题描述】:
在标准 C 中,您可以使用大小为 0 的数组结束结构,然后过度分配它以向数组添加可变长度维度:
struct var
{
int a;
int b[];
}
struct var * x=malloc(sizeof(var+27*sizeof(int)));
如何在 C++ 中以标准(可移植)方式做到这一点? 可以限制最大可能大小,显然不必在堆栈上工作
我在想:
class var
{
...
private:
int a;
int b[MAX];
};
然后使用分配器或重载 new/delete 以根据所需大小分配不足:
(sizeof(var) - (MAX-27)*sizeof(int)
但是,虽然它似乎有效,但我不想维护它。
是否有一种完全标准/便携的更简洁的方式?
【问题讨论】:
-
技术上不行,尽管“struct hack”(用大小 1 声明它,然后在你认为合适的时候过度分配)几乎适用于所有编译器。有人谈论
dynarray类型模糊地做了这样的事情,但我相信他们已经投票反对将它包含在 C++14 中(而且它绝对不存在于 C++98、03 或 11 中)。 -
在此处插入“无根据的实施”引用...
-
@GlennTeitelbaum:当然,理论上。然而,在实际实践中,唯一明显的区别是,将大小声明为 1 会使数学变得更简单。
-
这个标准C是从什么时候开始的?您需要将最后一个成员声明为
int b[];以获得灵活的数组成员;使用长度为 0 的数组是非标准扩展。 -
@claptrap:它还带来了内存局部性和单一分配(一次用于整个结构)。
标签: c++ data-structures struct standards standards-compliance