C 中的生存期和作用域

2021-04-07 07:38:12 字數 2396 閱讀 3612

生存期和作用域,究竟有什麼樣的關係呢?

先解釋一下生存期吧。

乙個程序對應的記憶體空間中,包含5種不同的資料區。

按照記憶體中從低到高的順序,分別為:棧、堆、bss段、資料段和**段。

棧:存放程式臨時建立的區域性物件。一般vc++6.0生成的可執行檔案只有1mib多的棧。

堆:存放程序執行中被動態分配的記憶體段。它大小並不固定,可動態擴張或縮減。屬於記憶體中最多的資源。

bss段:(它是block started by symbol的縮寫)存放程式中未初始化全域性物件,作業系統將自動把bss段全部置零。

資料段:存放已初始化的全域性物件和靜態物件。

**段:存放可執行檔案的操作指令,即可執行程式在記憶體中的映象。**段需要防止在執行時被非法修改,所以是唯讀的。

可以看出,只有**段是被作業系統保護為唯讀的,其他地方的常量都只被編譯器保護。

當然,記憶體中還有很多不屬於資料區的,它們是不可讀寫的。

在棧中的資料,生存期為包含它的{};

在堆中的資料,生存期為它被free或delete釋放前。

其他的資料,生存期為程序結束前。

使用者定義的變數或常量,在生存期內,除非使用者自行更改或被外界因素更改,否則不會被更改。

作用域則是可以直接顯式使用該變數或常量的區域。

注:這只是我自己下的定義,這樣堆中的資料應該是沒有作用域的,因為它不能被直接顯示使用(需要通過指標或引用)。

除了區域性靜態變數的作用域為為包含它的{}以外,其他和生存期相同。

下面做個簡單的測試,寫得很亂,看不下去的看結論就行了。

// file name : life_test.cpp

// author : keakon

// create date : 2006/5/26

// last edited date : 2006/5/27

// 測試各種物件的生存期和作用域

// 在vc++6.0下編譯執行通過

/#include

#include

using std::cout;

using std::string;

/class a

~a()

string const& getname() const

private:

string m_name;};/

a g("g");

const a g_c("g_c");

static a g_s("g_s");

const static a g_c_s("g_c_s");

const int num = 10; //存放指標陣列的大小

/void print(a const* p)

cout << "/n/n";}/

void printname(a const* p)

#endif

cout << p[i]->getname() << " :/t" << p[i] << '/n';

}cout << "/n/n";}/

void assign(a const* p)

/namespace test

void printstr()}/

int main()

; //全賦值為null

assign(p);

printname(p);

assign(p);

printname(p);

string const &pi = test::getstr(); //其實也可以用指標的,不過感覺引用更直觀

const_cast(pi) = "keakon是美女^^v"; //更改了常量,汗=。=

test::printstr(); //輸出「keakon是美女^^v」

return 0;}

/*注:

1.命名時,g表全域性,l表區域性,c表常量,s表靜態,h表堆,r表暫存器

2.下述結論使用「物件」來表示可以是變數,也可以是常量;因為我想不到有什麼好詞來表示

3.以下結論僅在vc++6.0中有效

結論:

1.全域性物件有static屬性(位址和static物件放在一起)

2.暫存器物件有auto屬性(位址和auto物件放在一起)//忘記在哪本書上看見的,貌似不能對register物件取位址

3.區域性非靜態物件(包括常量物件、暫存器物件和堆物件)在脫離作用域後,物件的內容是隨機的

4.靜態物件在脫離作用域後(程式結束前),仍可以被正常訪問,且內容保持不變

5.處於另乙個namespace的物件也符合上述結論(這裡只測試了全域性物件)

6.全域性或靜態物件析構時,編譯器可能已將其他非靜態物件析構了(如cout),因此可能不會輸出資訊。

實際上,如果全域性或靜態物件有非靜態的成員的話,在它析構前,它的這些成員就已經被析構了。

*/

08 作用域和生存期

2019獨角獸企業重金招聘python工程師標準 變數的作用域 scope 變數起作用或有效的 範圍,空間。變數的生存期 life time 變數存在的時間範圍,時間。1 根據變數的作用域將變數分為全域性變數和區域性變數 全域性變數儲存在靜態資料區,區域性變數在堆疊中。全域性變數 global va...

作用域與生存期

1.作用域 作用域指識別符號能夠被使用的範圍 只有在作用域內識別符號才可以被使用。在此階段針對編譯和鏈結過程。1 函式中定義的識別符號,包括形參和函式體中定義的區域性變數,作用域都在函式內,也稱作函式域。2 檔案作用域也稱全域性作用域。定義在所有函式之外的識別符號,具有檔案作用域,作用域為從定義處到...

靜態生存期和動態生存期

靜態生存期 定義 如果某乙個物件的生存期和程式的執行的生存期一樣,則這個物件具有靜態生存期。關鍵字 static 特點靜態變數不會隨著每次函式的呼叫產生乙個新的副本,也不會隨著函式返回而失效。第n次呼叫函式時,靜態變數的值為第n 1次呼叫的靜態變數的值,依次類推!也就是說靜態變數 第一次賦值有效,也...