C 記憶體模型 作用域和鏈結

2021-08-21 03:11:11 字數 3624 閱讀 3802

作用域(scope)描述了在檔案(翻譯單元)的多大範圍可見。

鏈結性(linkage)描述了名稱如何在不同單元間共享。鏈結性為外部的名稱可在檔案間共享,鏈結性為內部的名稱只能由乙個檔案中的函式共享。

(1)自動變數只在包含它們的函式或**塊中可見。

- 闡明自動變數的範圍

#includevoid oil(int x);

int main()

void oil(int x)

//板塊結束

當程式呼叫oil()時,這些變數仍留在記憶體中,但不可見。為兩個新變數(x和texas)分配記憶體,從而使它們可見。 在程式執行到oil()中的內部**塊時,新的texas將不可見。當程式流程離開該**塊時,將釋放最新的texas使用的記憶體,而第二個texas再次可見。當oil()函式結束時,texas和x都將過期,而最初的texas和year再次變得可見。(2)靜態變數在整個程式執行期間一直存在。編譯器分配固定的記憶體塊來儲存所有的靜態變數。與c語言一樣,c++也為靜態儲存持續性變數提供了三種鏈結性:外部鏈結性(可在其他檔案中訪問)、內部鏈結性(只能在當前檔案中訪問)和無鏈結性(只能在當前函式或**塊中訪問)。1.

2.

3.

int global = 1000;           //靜態持續,外部鏈結

static int one_file = 50; //靜態持續,內部鏈結

int main()

void func1(int n)

5種變數儲存方式

儲存描述

持續性作用域

鏈結性如何宣告

自動自動

**塊無

在**塊中

暫存器自動

**塊無

在**塊中,使用關鍵字register

靜態,無鏈結性

靜態**塊

無在**塊中,使用關鍵字static

靜態,外部鏈結性

靜態檔案

外部不在任何函式內

靜態,內部鏈結性

靜態檔案

內部不在任何函式內,使用關鍵字static

(3)靜態持續性、外部鏈結性

鏈結性為外部的變數通常簡稱為外部變數。 外部變數也稱全域性變數。

一方面,在每個使用外部變數的檔案中,都必須宣告它;另一方面,c++有「單定義規則」,該規則指出,變數只能有一次定義。

-- 外部變數

//與support.cpp一起編譯

#includeusing namespace std;

//外部變數

double warming = 0.3; //定義warming

//函式原型

void update(double dt);

void local();

int main() //使用全域性變數

-- 使用外部變數

//和external.cpp一起編譯

#includeextern double warming; //使用另乙個檔案中的warming

//函式原型

void update(double dt);

void local();

using std::cout;

void update(double dt) //修改全域性變數

void local() //使用區域性變數

1.update( )修改了warming,這種修改在隨後使用該變數時顯現出來了。

2.local( )函式表明,定義與全域性變數同名的區域性變數後,區域性變數將隱藏全域性變數。

3.c++比c語言更進一步——它提供了作用域解析運算子(::)。 放在變數名前面時,該運算子表示使用變數的全域性版本。

(4)靜態持續性,內部鏈結性。

static限定符用於作用域為整個檔案的變數時,該變數的鏈結性將為內部的。

//file1

int errors = 20; //外部宣告

...//file2

static int errors; //僅對file2可用

void froobish()

上述例子沒有違反單定義規則,因為關鍵字static指出識別符號errors的鏈結性為內部,因此並非要提供外部定義。

(5)靜態儲存持續性、無鏈結性

-- 使用乙個靜態區域性變數

#include//常數

const int arsize = 10;

//函式原型

void strcount(const char * str);

int main()

cout << "bye\n";

cin.get();

return 0;

}void strcount(const char * str)

1.由於陣列長度為10,因此程式從每行讀取的字元數都不超過9個。

2.每次函式被呼叫時,自動變數count都被重置為0;然而,靜態變數total只在程式執行時被設定為0,以後在兩次函式呼叫之間,其值將保持不變,因此能夠記錄讀取的字元總數。

(6)函式和鏈結性

c/c++中所有函式的儲存持續性都自動為靜態的,即在整個程式執行期間都一直存在。在預設情況下,函式的鏈結性為外部的,即在檔案間共享。實際上,還可以使用關鍵字static將函式的鏈結性設定為內部的,使之只能在乙個檔案中使用。必須同時在原型和函式定義中使用static關鍵字。

這意味著該函式只在這個檔案中可見,還意味著可以在其他檔案中定義同名的函式。 和變數一樣,在定義靜態函式的檔案中,靜態函式將覆蓋外部定義,因此即使在外部定義了同名的函式,該檔案仍將使用靜態函式。

(C ) 作用域和鏈結

作用域 描述了名稱在檔案 翻譯單元 的多大範圍內可見。例如 在function hello 中有個變數x,這個變數的作用域只在該函式範圍內有效。鏈結性為外部的可在檔案間共享,鏈結性為內部的名稱只能由乙個檔案中的函式共享。ps 自動變數的名稱沒有鏈結性,所以他們不能共享。變數的宣告週期的計算為 如果該...

C 作用域 鏈結屬性和儲存型別

變數在程式的某個部分宣告時,只能在程式的一定區域內才能訪問,這個區域就成為作用域。作用域分為四種 檔案作用域 函式作用域 塊作用域和原型作用域。編譯器通過變數宣告的位置來確定作用域 當變數在所有 塊之外宣告時就在檔案作用域中,檔案作用域的範圍是從變數宣告處一直到檔案的結束。但如果宣告在 h 檔案中,...

記憶體釋放和作用域銷毀

物件資料型別和函式資料型別在定義的時候首先會開闢乙個堆記憶體,堆記憶體有乙個引用位址,如果外面有變數已經知道了該引用位址,則會說該記憶體已經被占用了,那麼這個記憶體就不能夠被銷毀了。那為了保證瀏覽器的效能,瀏覽器有時如何釋放記憶體的?1 對於堆記憶體的釋放,是通過null操作來銷毀記憶體的,只要把所...