一、示例說明
//代碼示例
//情景一:
int main() {
int array[] = {1,2,3,4};
std::cout << sizeof (array) / sizeof (*array) << std::endl;
return 0;
}
//情景二:
int test_func(int array[]) {
std::cout << sizeof (array) / sizeof (*array) << std::endl;
}
int main() {
int array[] = {1,2,3,4};
test_func(array);
return 0;
}
//情景三:
template <typename T>
void test_func(T&& array) {
std::cout << sizeof(array) / sizeof(*array) << std::endl;
}
int main() {
int array[] = {1,2,3,4};
test_func(array);
return 0;
}
實際輸入結果如下:
//1
9
//2
2 //實際 sizeof(long) / sizeof(int)
//3
9
所以我們得出的結論是:
1 作用域內 sizeof 能夠計算出數組的長度
2 胯作用域使用 傳遞地址方式傳遞 sizeof 能做的是將地址轉化成長整形計算出 long 的長度
3 通過模板函數地址傳遞能夠確保數組被完整的傳遞過去
二、問題解析
2.1 範例二說明
先看預編譯輸出內容
test.cpp:182:25: warning: sizeof on array function parameter will return size of ‘int *’ instead of ‘int []’
test.cpp:181:17: note: declared here
從編譯輸出來看,顯然它認識到這玩意兒是個數組,但是它不太清楚你爲啥只填了一個地址,所以它就猜你可能需要計算它地址長度,就是 int * 而不是 int[] (典型好心辦壞事)
而一個地址一般都是 16 進制的長整形,所以這就是爲何 sizeof(array) 計算出 8 (計算機內部地址總線的寬度)
2.2 範例三說明
核心在於 T&& array
根據模板推導原則,T array
它直接拿到的就是數組地址,而 && / & 就會自動推導來保留數組形態