[英]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.