2015-11-01 97 views
2

書中Object oriented programming in c++ by Robert Lafore說,靜態局部變量何時出現?

靜態本地變量具有自動本地 變量的可見性(即包含它的函數的內部)。但是,其生命週期與全局變量的生命週期相同,只是它在包含它的功能 的第一次調用之前不會存在。此後它在 計劃的生命中一直存在

第一次調用函數後會出現什麼意思?在程序加載到內存中時,分配靜態本地存儲。

回答

3

在輸入main之前分配了存儲空間,但是(例如)如果靜態對象具有副作用,那麼這些副作用可能會延遲到第一次調用該函數之前。

但是請注意,這不是必然的情況。常量初始化只需要在塊進入之前發生(不一定就像執行「跨越」那個定義一樣)。同樣,在某些情況下,允許實現初始化其他塊範圍的靜態變量(如果您想深入瞭解具體情況,可以查看[basic.start.init]和[stmt.dcl] ,但它基本上可以歸結爲:只要不影響與它的初始化的值。例如,如果你有這樣的事情:

int i; 
    std::cin >> i; 
    { 
     static int x = i; 

...實施將無法初始化x直到塊被輸入,因爲直到它們被初始化的值將不知道。另一方面,如果你有:

{ 
    static int i = 0; 

...這個實現可以在它想要的時候執行初始化(並且大部分基本上會在編譯時執行這樣的初始化,所以它不會涉及在運行時執行任何任何指令)。但是,即使對於較不平凡的情況,在邏輯上可能的情況下也允許較早的初始化(例如,該值不是來自先前的執行)。

+0

> [basic.start.init]和[stmt.dcl] 這些是什麼?我是新來的C++。 – q126y

+1

@ q126y - 這些是[C++標準文檔]中的章節名稱(http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf),在1300頁... –

1

這意味着函數內部的10靜態變量不會被初始化(通過構造函數或賦值運算符),直到第一次調用該函數。

1

只要調用包含靜態局部變量的函數,就會初始化靜態局部變量。

2

在C++對象的存儲持續時間(當原始存儲器被分配給它)和壽命的對象的是兩個獨立的概念。提交人顯然是指當後者談論對象「成立」時。

在一般情況下,爲對象分配存儲以使其「存在」是不夠的。 重新初始化一旦其初始化完成,對象的生命週期開始。例如,具有不平凡構造函數的類的對象在構造函數完成執行之前不會正式「活動」。

當控件第一次通過聲明時執行靜態本地對象的初始化。在此之前,對象並不正式存在,即使它已經分配了內存。

請注意,作者在他的描述中並沒有刻意精確。只調用包含聲明的函數是不夠的。控件必須通過對象的聲明才能開始其生命週期。如果函數包含分支,則在第一次調用函數時不一定發生這種情況。

對於具有微不足道的初始化對象(如int對象),有存儲持續時間壽命之間沒有差別。對於這樣的對象來說,分配內存是所有需要完成的。但是一般情況下,僅僅分配內存是不夠的。

+0

刻意精確 - 但仍然是錯誤的。 C++ 98/03有一些例外。 C++ 11增加了更多。 –

+0

@Jerry Coffin:不,沒錯。標準中的例外都不會改變* general case *中的圖片。因此,當主要觀點是*存儲時間*和*生命期*之間的差異時,他們並不重要。 (最重要的是,這些例外的意圖一直是爲了允許早期的*微不足道的初始化,這使得它除了這個問題的上下文之外。) – AnT