簡體   English   中英

“sizeof”如何在這個幫助程序中用於確定數組大小?

[英]How does “sizeof” work in this helper for determining array size?

我發現這篇文章提出了以下模板和一個用於獲取數組大小的宏:

template<typename Type, size_t Size>
char ( &ArraySizeHelper(Type( &Array )[Size]) )[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))

我發現以下部分完全不清楚。 sizeof應用於 function 聲明。 我希望結果是“function 指針的大小”。 為什么它會獲得“返回值的大小”呢?

sizeof應用於 function調用的結果,而不是聲明。 因此,它給出了返回值的大小,在這種情況下,它是對字符數組的引用。

該模板使返回類型中的數組具有與參數數組相同數量的元素,參數數組從宏饋送到 function。

最后,將sizeof應用於對該 char 數組的引用。 引用上的sizeof與類型本身的sizeof相同。 由於sizeof(char) == 1 ,這給出了數組中元素的數量。

template<typename Type, size_t Size>
char (&ArraySizeHelper(Type(&Array)[Size]))[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))

sizeof應用於 function 聲明。 我希望結果是“function 指針的大小”。 為什么它會獲得“返回值的大小”呢?

它不是sizeof ArraySizeHelper (這將是非法的 - 不能采用sizeof函數),也不是sizeof &ArraySizeHelper - 甚至不是隱式的,因為標准明確禁止從 function 到指向函數的隱式轉換,對於 C++0x,請參見5.3.3)。 相反,它的sizeof ArraySizeHelper(Array)相當於sizeof function 調用返回的值,即sizeof char[Size]因此Size

ArraySizeHelper是一個 function 模板,它返回一個大小為Sizechar數組。 該模板有兩個參數,一個是類型(即Type ),另一個是(即Size )。

因此,當您將類型為A[100]的 object 傳遞給 function 時。 編譯器推導出模板的 arguments : Type變為ASize變為100

所以實例化的 function 返回類型變為char[100] 由於sizeof的參數從未被評估,因此 function 不需要定義 sizeof只需要知道 function 的返回類型char[100] 這等效於sizeof(char[100])返回 100 - 數組的大小。

另一個需要注意的有趣點是sizeof(char)不依賴於編譯器,這與其他原始類型不同(除了char 1的變體)。 它總是1 所以sizeof(char[100])保證為100

1. 根據標准, char的所有變體的大小都是 ONE,無論是charsigned charunsigned char

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM