如果在编译时知道大小,是否有一种干净的方法在堆栈上分配可变大小的对象?

时间:2016-04-26 23:07:40

标签: c++

考虑以下代码,该代码尝试在堆栈上分配包含可变长度数组的对象。

#include <stdio.h>

struct ContainVarLen {
    int normal;
    int varlen[];
};


int main(){
    ContainVarLen c;
}

假设我在编译时知道我需要varlen对象中的8字节数据。

是否有语法指定我想要额外的8字节分配?

我认为在对象之前声明一个字节数组似乎是一个黑客。

2 个答案:

答案 0 :(得分:6)

template <std::size_t NBytes>
class ContainVarLen
{
    int normal;
    int varlen[NBytes / sizeof(int)];
};

现在使用任何constexpr实例化:

constexpr long fib(const int x)
{
    return x <= 1 ? 1 : fib(x - 1) + fib(x - 2);
}

int main()
{
    ContainVarLen<fib(7)> c;
    ...
}

答案 1 :(得分:0)

没有标准的可移植C ++语法。

某些编译器可能会提供自己的非标准扩展,有时可用于可移植性不是因素。

例如,使用gcc我会做这样的事情:

struct ContainVarLen {
    int normal;
    int *varlen;
};

int foo(size_t n) {

    int varlen_buf[n];

    ContainVarLen c;
    c.varlen=varlen_buf;
}

另一种可能的想法是将alloca(3)与展示位置一起使用。