首頁 > 後端開發 > C++ > 如何在編譯時有效決定 C 數組的大小?

如何在編譯時有效決定 C 數組的大小?

Barbara Streisand
發布: 2024-11-30 08:06:16
原創
340 人瀏覽過

How Can I Efficiently Determine the Size of a C   Array at Compile Time?

理解「陣列的大小」範本函數

此程式碼定義了一個範本函數GetArrLength,旨在決定陣列的大小:

template<typename T, int size>
int GetArrLength(T(&amp;)[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&amp; sizeof_array_helper(T(&amp;)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))
登入後複製

該技術利用了字符數組的大小等於其元素計數的事實。 sizeof 運算子檢索用於表示模板參數大小的 char 陣列的大小,提供陣列大小的常數表達式評估。

以上是如何在編譯時有效決定 C 數組的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板