[英]Does sizeof work at compile time?
我運行了這個示例程序。
const int x = 5;
int main(int argc, char** argv)
{
int x[x];
int y = sizeof(x) / sizeof(int);
return 0;
}
y的值是5。
但這怎么可能呢? 因為當我調試時,x的值是5,所以x的大小是4,int的大小是4.而y的值應該是不同的。
我錯過了什么?
sizeof(x)
指的是具有5
int
類型元素的數組。 因此輸出。
如果沒有重載名稱x
,代碼將更容易理解。
從技術上講,這里有一個可變長度數組,一個VLA。 這是因為C const
實際上意味着只讀,必須在運行時進行評估。 因此,在這種情況下, sizeof
在運行時進行評估。
如果您使用文字來改變數組的大小,即int x[5];
那么sizeof
將在編譯時進行評估。
如果代碼編譯為C ++,那么const將是一個真正的const,因此可以在編譯時進行評估。
你有變量隱藏在這里。 您的代碼大致相當於:
const int x = 5;
int main(int argc, char** argv)
{
int x2[x];
int y = sizeof(x2) / sizeof(int);
return 0;
}
然后它更清楚: sizeof(x)==4
, x==5
, sizeof(x2)==20
。
x的類型為int [5]。 因此,大小為5 * sizeof(int)。 sizeof是一個運算符,而不是函數或宏。
這就是為什么當人們聲稱C數組只是指針時,有些人會生氣,但遺憾的是你無法傳遞數組。 您只能將指針傳遞給它的第一個元素,並且您將丟失此信息。
由於int x是const
,因此這是一個固定大小的數組。 Sizeof在編譯時計算。
x
有五個要素,正如定義清楚地表明的那樣。 它的大小是5 * sizeof(int)。
這是GCC,我用printf打印出y的值:
subl $48, %esp
movl $5, 4(%esp)`
分配的空間和y的值都被編譯為常量。
另外,從標准:
If the size is an integer constant expression and the element type has
a known constant size, the array type is not a variable length array type [...]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.