繁体   English   中英

C ++中vlas的编译时与运行时const变量分配和分配

[英]Compile- vs run-time const variable assignment and allocation of vlas in C++

当出现许多问题时,我正在使用带有非类型参数的模板函数(以避免动态分配数组)。 我的第一个问题是关于编译时变量分配的。 这是由于以下尝试调用模板函数引起的:

template<int n>
int *getDegrees(int A[][n]) {
  //return degrees
}

int main(int argc, char **argv) {
  int n = 10;
  int A[n][n];
  int *degs = getDegrees<n>(A);
}

这里,我们有两个错误:首先,编译器无法解决对getDegrees(A)的调用:

main.cc:27: error: no matching function for call to ‘getDegrees(int [(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)][(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)])’

其次,我们不能在模板调用中使用n ,因为它不是常量表达式。 简单地使n不变就可以解决问题

const int n = 10;

但是,如果我要做

int m = 10;
const int n = m; 

我们得到同样的错误。 虽然编译器可能允许第二个分配,但这样做是否被认为是不好的形式? 另外,为什么使n常数在解析函数调用中有所不同?

我的另一个问题与vlas有关:是在堆栈还是堆上为它们分配了内存(并且此内存依赖于编译器)? 甚至在C ++中允许使用它们似乎都存在争议,是否应避免使用矢量(或类似容器)?

感谢任何见识!

我将尽力回答您的问题。
您可以更改函数原型以通过引用接收数组:

template<size_t n> // see the type
int *getDegrees(int (&A)[n][n]) {  // see the signature
  // ...
}

在上面的代码中,我们利用了数组具有相同尺寸的事实。
但是,一般情况下应该是:

template<size_t n1, size_t n2> // see the type
int *getDegrees(int (&A)[n1][n2]) {  // see the signature
  // ...
}

如果大小太大,则编译器会发出错误通知您。 例如(来自g ++):

错误:数组“ A”的大小太大

现在来看另一个有关常量整数赋值之间差异的问题。
在C ++中,数组大小必须是编译时间常数,并且

const int n = 10;

满足该要求。 因为编译器可以确定,所以10是分配给n的文字数字。

的情况下,

int m = 10;
const int n = m;

编译器发现n的来源本身不是编译时间常数。 因此,这会使代码格式错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM