簡體   English   中英

我應該如何初始化我的全局變量?

[英]How should I initialize my global variables?

我有一堆我喜歡用特定函數初始化的全局變量,比如:

// MyFile.h

typedef struct myValues
{
    int a;
    int b;
    int c;
} myValuesType;
 
extern myValuesType values[5];
 
void Initialize(void);
 
 
// MyFile.c

myValuesType values[5];
 
// This gets called in main() before everything else
void Initialize(void)
{
    values[0].a = 1;
    values[0].b = 2;
    values[0].c = 3;
 
    // ETC
} 

但是,我遇到了一些直接在定義中進行初始化的代碼,如下所示:

// MyFile.h
typedef struct myValues
{
    int a;
    int b;
    int c;
} myValuesType;
 
extern myValuesType values[];
 
// MyFile.c
myValuesType values[] =
{
    {0,1,2},
    // Etc.
}

對我來說,對於這個特定的例子來說,第二個實現更苗條,也許更干凈,但我最感興趣的是實際發生的事情:兩者之間有什么區別?

我是否通過在沒有任何值的情況下定義它們,然后調用 function 來初始化它們來讓計算機做更多的事情?

是不是就像在第二種情況下,是編譯器在做這項工作,並且在很大程度上,這會產生一個非常優化的代碼?

最后,第二個實現並不總是適用的,對吧? 就像我需要將它們初始化為函數返回的值,或者如果我需要 malloc 值,(或您想到的任何其他情況)我需要創建一個 function 來初始化它們,對嗎?

但是對於我發布的代碼片段,有什么更好的方法來處理它?

我是否通過在沒有任何值的情況下定義它們,然后調用 function 來初始化它們來讓計算機做更多的事情?

是的。 編譯器會在 .exe 文件中創建一個 function 將值寫入變量(因為這是您告訴編譯器要做的),並且計算機將在程序運行時運行它。

澄清一下:編譯器將在 exe 文件中創建 Initialize function。 一位評論者認為我的意思是編譯器會自行創建一個額外的 function。

是不是就像在第二種情況下,是編譯器在做這項工作,並且在很大程度上,這會產生一個經過優化的代碼?

是的。 編譯器只會將值直接寫入 .exe 文件,在此變量的數據部分中。 操作系統加載 .exe 文件后,這些值已經存在,計算機無需執行任何額外操作。 此外,這些值直接在它們的最終布局中,而在第一個選擇中,function 基本上由一長串“將這個值放在這個地址”組成,這意味着地址也必須被處理。

最后,第二個實現並不總是適用的,對吧? 就像我需要將它們初始化為函數返回的值,或者如果我需要 malloc 值,(或您想到的任何其他情況)我需要創建一個 function 來初始化它們,對嗎?

對,那是正確的。 第二個僅適用於您在編譯時知道所有值的情況。


在 C++ (您沒有使用)中,您始終可以使用第二個,盡管編譯器只是在它不起作用時將其轉換為第一個。 如果需要,編譯器將在main之前插入 function 調用,如果函數聲明為constexpr ,它有時也可能在編譯時運行這些函數。

將我的評論轉化為答案。

您的第一個代碼不是“初始化”變量——它們被初始化為全零(因為沒有顯式的初始化程序),並且您的代碼在程序運行后為它們分配其他值。

盡可能使用第二個示例中的初始化程序——它更簡單、更有效。 使用初始化時,系統不會加載所有字節為零的數據,然后覆蓋 function 調用中的 memory。 此外,無法避免正確初始化 memory,而使用 function 調用,您可能會忘記調用它,而將 memory 保留為“所有字節為零”。

但是,如果您還需要在進行一些計算后將全局變量重置為已知的“並非所有字節為零”state,那么 function 可能是更好的選擇 - 但您可能還需要問自己“為什么我有需要這種(重新)初始化的全局變量?”

如果初始化必須使用 function 調用或者如果需要分配動態 memory,那么您必須使用初始化 function。

暫無
暫無

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

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