此程式碼定義了一個範本函數GetArrLength,旨在決定陣列的大小:
template<typename T, int size> int GetArrLength(T(&)[size]){return size;}
參數T(&)[size] 被宣告為對 T類型大小為 size 的陣列的參考。這意味著它接受對類型和大小指定為模板參數的任何數組的引用。
呼叫此函數時,編譯器會嘗試推導模板參數。例如,如果我們這樣呼叫:
int a[10]; GetArrLength(a);
編譯器將確定 T 為 int,大小為 10,建立一個對 10 個整數陣列的參數參考。
函數傳回範本參數size的值,有效提供了範本中元素的數量array.
此程式碼簡化了數組大小的獲取,但有一些缺點。首先,它對模板參數和回傳值都使用有符號類型,這是有問題的,因為大小不能為負數。為了獲得更穩健的解決方案,應使用無符號類型,例如 std::size_t。
其次,此函數的結果不是常數表達式,即使陣列大小應該是。常量表達式求值對於某些最佳化至關重要。
提供常數表達式結果的更高級方法涉及使用類型自省和sizeof 運算符:
template <std::size_t N> struct type_of_size { typedef char type[N]; }; template <typename T, std::size_t Size> typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]); #define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))
該技術利用了字符數組的大小等於其元素計數的事實。 sizeof 運算子檢索用於表示模板參數大小的 char 陣列的大小,提供陣列大小的常數表達式評估。
以上是如何在編譯時有效決定 C 數組的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!