20200617-01 sizeof 和數組使用上的注意實現 C/C++

一、示例說明

//代碼示例
//情景一:
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 //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 它直接拿到的就是數組地址,而 && / & 就會自動推導來保留數組形態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章