2010-05-22 47 views
0

我有幾個全局變量需要設置值,我應該將它設置爲main/winmain函數嗎?或者我應該在第一次使用每個var時設置它?我應該在啓動時還是第一次使用它們時設置全局變量值? C++

+2

嘗試使用'0'作爲初始值,並且不需要手動初始化它們,然後 – 2010-05-22 18:12:56

+3

@Merlyn,是的,您的評論是不正確的。如果可以的話,我也會降低它的速度:)請閱讀有關命名空間範圍變量的初始值。 – 2010-05-22 21:01:08

+0

@Johannes:對不起。你是對的,我充滿了它:)似乎在主執行之前BSS被初始化爲零,這就是全局存儲的地方。然而,這又是另一個C++太複雜的例子:) Upvoted你的糾正。 – 2010-06-04 08:32:10

回答

4

相反,如何根本不使用全局變量?

將變量作爲函數參數傳遞給需要它們的函數,或將它們的指針或引用存儲爲使用它們的類的成員。

+0

我需要每次調用該函數的權利?或者至少對於每個使用它的課程? – extintor 2010-05-22 18:52:15

+0

@extintor:如果你正在從一個函數變量的值,那麼你可以調用該函數一次,保存它的結果,而且結果傳遞給任何需要它的函數或類。 – 2010-05-22 18:58:14

1

是否有機會不使用全局變量?計算其中的任何一個很貴?如果是這樣,那麼你有一個懶惰初始化的參數。如果他們很快計算或總是要使用,那麼在啓動時啓動它們。沒有理由不這樣做,並且您將節省您每次使用它時必須檢查初始化的頭疼。

+0

主要的變種是windows版本和內部版本號,我認爲它的計算並不昂貴。我仍然在討論在啓動時設置它們或每次爲每個類調用函數。這兩種方式都可以正常工作,但我是C++新手,但我仍然不知道最佳實踐。 – extintor 2010-05-22 18:55:20

+0

然後我會遵循James的建議,而不是使用全局變量。 – stonemetal 2010-05-22 19:00:24

0

當鏈接器鏈接您的程序在一起,全局變量(也稱爲可寫靜態數據)被分配到自己的存儲部分(ELF .data段),並有一個值預先分配給他們。這意味着編譯器不需要生成指令來初始化它們。如果您在主函數中初始化它們,編譯器將生成初始化指令,除非它足夠聰明以優化它們。

這對於ELF文件格式當然是對的,我不確定其他可執行格式。

相關問題