部落格02:
一、c語言中文網
static 除了可以修飾全域性變數,還可以修飾區域性變數,被 static 修飾的變數統稱為靜態變數(static variable)。
不管是全域性變數還是區域性變數,只要被 static 修飾,都會儲存在全域性資料區(全域性變數本來就儲存在全域性資料區,即使不加 static)。
全域性資料區的資料在程式啟動時就被初始化,一直到程式執行結束才會被作業系統**記憶體;對於函式中的靜態區域性變數,即使函式呼叫結束,記憶體也不會銷毀。
注意:全域性資料區的變數只能被初始化(定義)一次,以後只能改變它的值,不能再被初始化,即使有這樣的語句,也無效。
二、部落格01
我們將以下面的例子介紹const變數和static變數的存放位置:
static int val_a = 1; // 初始化的靜態變數
int val_b = 2; // 全域性變數
const int val_c = 3; // const 全域性變數
static int val_d; // 未初始化的靜態變數
int val_e; // 未初始化的全域性變數
int main()
static int val_f = 5; // 初始化的區域性靜態變數
static int val_g; //未初始化區域性靜態變數
int val_h = 6; //初始化區域性變數
int val_i; //未初始化區域性變數
const int val_j = 7; //const區域性變數
return 0;
①static無論是全域性變數還是區域性變數都儲存在全域性/靜態區域,在編譯期就為其分配記憶體,在程式結束時釋放,例如:val_a、val_d、val_h、val_i。
②const全域性變數儲存在唯讀資料段,編譯期最初將其儲存在符號表中,第一次使用時為其分配記憶體,在程式結束時釋放,例如:val_c;
const區域性變數儲存在棧中,**塊結束時釋放,例如:val_j。
rodata段(read-only-data)-常量區 rodata段儲存常量資料,比如程式中定義為const的全域性變數,#define定義的常量,以及諸如「hello world」的字串常量。唯讀資料,儲存在rom中。 注意:有些立即數與指令編譯在一起,放在text段。 const修飾的全域性變數在常量區;const修飾的區域性變數只是為了防止修改,沒有放入常量區。 編譯器會去掉重複的字串常量,程式的每個字串常量只有乙份。 有些系統中rodata段是多個程序共享的,目的是為了提高空間利用率。
③全域性變數儲存在全域性/靜態區域,在編譯期為其分配記憶體,在程式結束時釋放,例如:val_b、val_e。
④區域性變數儲存在棧中,**塊結束時釋放,例如:val_h、val_i。
注:當全域性變數和靜態區域性變數未賦初值時,系統自動置為0。
部落格02
3、const變數的記憶體位於棧區或者靜態儲存區,不在符號表(常量表)中:
關於網上所說const修飾的變數儲存在符號表中,這個並不完全是對的,const變數的記憶體位於c++的5大記憶體中的棧區或者靜態儲存區。在編譯的時候,對於不試圖通過記憶體來修改const變數值的,編譯器統統將const變數存放在編譯器內部產生的臨時列表中,也就是所謂的符號表,該符號表與目標檔案連線用的符號表是兩個完全不同的東西。此臨時符號表的作用就是提高效率,是編譯器優化形成了,所以大家不必過多糾結const變數記憶體存放位置了,它的記憶體就是位於棧區或者靜態儲存區。
如果還有興趣研究這個的,大家看看彙編**不就完了,我本人菜雞現在還不會。。還有關於這個的討論,大家可以看看。。
測試**如下:(該**等學了彙編在做深入研究,現在先放一放。。)
const
int i =
100;
int n =0;
class
ctest
;int l;
const
int j;
static
const
int k =
102;};
void
test3()
const static變數存放位置
我們將以下面的例子介紹const變數和static變數的存放位置 static int val a 1 初始化的靜態變數 int val b 2 全域性變數 const int val c 3 const 全域性變數 static int val d 未初始化的靜態變數 int val e 未初始化...
變數存放的區域
int a 0 class someclass int main 1 棧區 stack 由編譯器自動分配釋放 存放為執行函式而分配的區域性變數 函式引數 返回資料 返回位址等。2 堆區 heap 一般由程式設計師分配釋放,new,malloc之類的,若程式設計師不釋放,程式結束時可能由os 3 全域...
const static和extern關鍵字
一 巨集定義 概念 巨集定義實質是乙個預編譯指令,在程式未執行之前將某些指令付給相應的變數。一般情況預處理指令都是以 號開頭的,所以巨集定義也是以 開發,關鍵字為 define 定義巨集定義 undef 結束巨集定義 定義格式及作用域 一般巨集定義都定義在程式的首段 define 巨集名 值。巨集定...