簡體   English   中英

sizeof是否在編譯時工作?

[英]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)==4x==5sizeof(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.

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