生存期和作用域,究竟有什麼樣的關係呢?
先解釋一下生存期吧。
乙個程序對應的記憶體空間中,包含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次呼叫的靜態變數的值,依次類推!也就是說靜態變數 第一次賦值有效,也...