const static變數存放位置 解析

2021-09-28 19:28:40 字數 2056 閱讀 7335

部落格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 巨集名 值。巨集定...