簡體   English   中英

在編譯時需要為本地靜態變量分配內存嗎?

[英]What is the need, local static variables are allocated memory during compile time?

我正在學習C語言中的static變量,並且了解到static變量的內存是在編譯時分配的(在編譯時必須分配多少內存,其虛擬地址是在編譯時計算的,而在程序加載時則分配實際的內存)。數據段/.bss,取決於是否初始化

我在一些網站上看到,由於對象/變量將采用的大小是根據變量類型預先定義的,因此內存是在編譯時分配的。 但是對於在函數中定義且范圍僅在函數內的局部static變量,我不了解此需求。

考慮以下代碼片段:

void func()
{
    static int i;
    /*some logic*/
} 

void func1()
{
    static int data[10] = {1,2,3,4,5,6,7,8,9,10};
    /*some logic*/
}

int main()
{
    /*logic not involving func() and func1()*/
}

在這種情況下,程序中根本不會調用函數funcfunc1 ,但是一旦程序加載( 從我的經驗中學到 )實際上沒有使用的那些變量中, static函數的內存就被分配了。 因此,有了這個缺點,為局部static變量分配內存的用途是什么。 當編譯器通過函數時,為什么不能在數據段中為它們分配內存。

我已經解決了有關此問題的堆棧溢出問題,但無法獲得確切的答案,請幫助!!!

在編譯時分配和初始化內存意味着程序不必跟蹤功能是否已經輸入以及變量是否已初始化。 具有恆定初始值的局部靜態變量與全局變量基本相同,不同之處在於名稱僅在該函數的范圍內。

這是一個時空折衷方案-在第一次調用期間對其進行初始化將需要每次調用該函數時都必須執行的代碼。 在加載程序時初始化它意味着它的初始化是從可執行文件的文本段到內存數據段的塊復制的一部分,以及全局靜態變量。

請參見C ++函數中的靜態變量的生存期是多少? 對於C ++局部靜態變量的更復雜的情況。 在C ++中,我可能會使用靜態的std::array ,在輸入該函數之前,我認為不會將其初始化。

如果函數中有一個很少被調用的大型數組,並且不想浪費內存,請使用靜態指針而不是靜態數組,然后自行對其進行初始化。

void func1() {
    static int *data;

    if (!data) { // Need to protect this with a mutex if multi-threading
        data = malloc(N * sizeof(int));
        for (int i = 0; i < N; i++) {
            data[i] = i;
        }
    }
    ...
}

這是編譯器必須執行的代碼,才能對數組進行首次初始化。

暫無
暫無

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

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