簡體   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