1. 程式人生 > >C語言程式碼和各種常量、變數在記憶體中的儲存位置及記憶體優化

C語言程式碼和各種常量、變數在記憶體中的儲存位置及記憶體優化

全域性變數、靜態區域性變數儲存在全域性資料區,初始化的和未初始化的分別儲存在一起;

普通區域性變數儲存在堆疊中;

全域性變數和區域性變數在記憶體裡的區別? 
一、預備知識—程式的記憶體分配 

一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分 

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。 


3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域

(RW), 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域(ZI)。 - 程式結束後有系統釋放 

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放 (RO)

5、程式程式碼區—存放函式體的二進位制程式碼。 (RO)

注:

1、對於RO、RW和WI的概念不是特別清楚的朋友,可以參考我的另外一篇文章,裡邊有詳細的解釋。

2、按我個人理解為了減少記憶體碎片的產生,編譯器可能會將堆區又分為block和heap區。block由一系列大小相等的記憶體塊組成。分配記憶體時先在block中分配,如果block佔滿則從heap區中分配。同時block的大小和個數可以通過配置檔案進行配置,使之達到一個合適的數量。

例:

/* =========================== */
/*  HEAP CONF                  */
/* =========================== */
/*  General configuration for both linear heap and block based heap
 *  define this list to the size and count of individual fixed-size pools
 */
#define BLOCK_LIST \
    /*    size count */ \
    BLOCK(  22,   80 )  \
    BLOCK(  44,   64 )  \
    BLOCK(  56,   16 )

 
二、例子程式 

//main.cpp 

int a = 0; 全域性初始化區 

char *p1; 全域性未初始化區 

main() 



int b;// 棧 

char s[] = "abc"; //"abc"在常量區,s在棧上。 

char *p2; //棧 

char *p3 = "123456"; //123456\0";在常量區,p3在棧上。 

static int c =0; //全域性(靜態)初始化區 

p1 = (char *)malloc(10); 

p2 = (char *)malloc(20); 

//分配得來得10和20位元組的區域就在堆區。 

strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。 

相關推薦

C語言程式碼各種常量變數記憶體儲存位置記憶體優化

全域性變數、靜態區域性變數儲存在全域性資料區,初始化的和未初始化的分別儲存在一起; 普通區域性變數儲存在堆疊中; 全域性變數和區域性變數在記憶體裡的區別? 一、預備知識—程式的記憶體分配  一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分  1、棧區(stack

《Linux C程式設計一站式學習》——常量變數表示式notes

、字元和字串區別:字元常量用單引號括起來,例如'}',例如'a\n',這時雖然單引號括了兩個字元,但實際上 只表示一個字元。 2、列印一個%,程式碼如下: 3、floor、ceil取整規則,自動型別轉換 1 #include <stdio.h> 2 #include <

CRC32 C語言程式碼 JAVA程式碼

C語言如下: uint32_t crc32_compute(uint8_t const * p_data, uint32_t size){    uint32_t crc;    crc = 0xFFFFFFFF;    for (uin

CRC8 C語言程式碼 JAVA 程式碼

crc8 從語言程式碼如下: unsigned char const crc8_tab[256]   =   {      0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x

2017第八屆藍橋杯 (C/C++C)組貪吃蛇長度-C語言程式碼思路

標題:貪吃蛇長度 ±------------------------------------------------+ | | | H###### #### | | # # # | | # # # | | # #### # # | | # # # # # | | #####

c語言----定義使用結構體變數

1.結構體型別 由於一個數組中只能存放同一種類型的資料,很不方便,所以C語言允許使用者自己建立由不同型別資料組成的組合型的資料結構,也就是結構體,通俗講就像是打包封裝,把一些有共同特徵(比如同屬於某一類事物的屬性,往往是某種業務相關屬性的聚合)的變數封裝在內部,通過一定方法

C語言入門教程-(4)常量變數

1.常量和變數的概念 程式執行過程中其值不能發生改變的量叫做常量,其值能發生改變的量叫做變數。常量可以直接使用,而變數則必須先定義後才能使用,否則編譯器會報錯。 2.常量和變數的命名規範 在介紹常量和變數的命名規範之前,我們先了解一下什麼是識別符號和關鍵字。 1)識別符號 識別符號,用來識別符號號常

C語言入門(4)——常量變數與賦值

對於基本資料型別量,按其取值是否可改變又分為常量和變數兩種。在程式執行過程中,其值不發生改變的量稱為常量,其值可變的量稱為變數。它們可與資料型別結合起來分類。常量常量有字元常量(CharacterConstant)、數字常量和列舉常量。列舉常量以後再介紹,現在我們看看如何使用

C語言 常量變數

在我們使用計算機的過程中,會接觸到各種各樣的資料,有文件資料、圖片資料、視訊資料,還有聊QQ時產生的文字資料、用迅雷下載的檔案資料等。這講我們就來介紹C語言中資料的處理。 一、資料的儲存 1.資料型別 首先來看看計算機是怎麼儲存資料的。總的來說,計算機中儲存的資料可以分為兩種:靜態資料和動態資料。 1

C語言常量變數及其屬性,型別儲存空間

部落格源地址  http://www.codertown.cn/blog/?p=134 常量和變數其實就是C語言裡的值,其他程式語言同樣存在,這個跟數學裡的是一樣的。 1、常量 固定的值,不可改變的值是常量,幾種型別: 在表示式中直接用數值表示;巨集定義當然也是

C語言創建符號常量的三種方法;printf()scanf()函數

c1、#indefine pi 3.1415926形式的宏定義2、const int MONTHS=12;這使得MONTHS成為一個只讀值。3、enum 枚舉類型4、printf()和scanf()函數使我們能夠與程序通信,他們被稱為輸入/輸出函數,(I/O函數)5、字符串、浮點數輸出的類型及介紹:實例程序:

c語言基礎之指針數組結構體

sizeof 12px 不為 auto 思維方式 中介 -c struct 數據結構 指針是c語言的靈魂怎麽強調都不為過,指針也是c語言最復雜和難理解的概念,數組是多個類型相同的變量在一塊連續的內存空間,數組是最基本也算是最簡單的數據結構,結構體本質上就像是一個包裹

GSM A5/1演算法C語言程式碼實現分析

介紹 全球超過200個國家和地區超過10億人正在使用GSM電話。對中國使用者來說,GSM就是移動和聯通的2g模式。 在1982年A5首次提出時,人們認為A5 / 1金鑰長度要128位,但最終確定的結果是64位金鑰(政府可以使用暴力破解算出)。很可能是政府的壓力迫使金鑰位數縮

哈夫曼樹詳細講解(帶例題C語言程式碼實現——全註釋)

** 哈夫曼樹詳細講解(帶例題和C語言程式碼實現——全註釋) ** 定義 哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的 路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點

C語言的 = ==!=

簡單講解 = 和 ==、!= 1. =: 在C語言中等號(=)為賦值操作符,下面進行簡單說明賦值操作符的使用 1) 變數的賦值操作: int a; a = 10; 此處為將10賦值給a,賦值過後a的值為10 2) 指標變數的賦值操作:(分別為 取地址的

發工資咯:)(C語言解析程式碼

int main() {     int n,i;     int a[101];     int a100,a50,a10,a5,a2,a1,t1,t2;     while(scanf("%d",&n),n!=0)     {         for(i=0;i<n;i++)       

c語言】巨集(#define###)與函式比較

#define -定義識別符號 ef:#define在預處理階段替代所有的Max #define Max 100 int main() { printf("%d\n", Max); system("pause"); return 0

Java語言基礎(一)---關鍵字識別符號註釋常量變數運算子

Java語言基礎組成:關鍵字、識別符號、註釋、常量和變數、運算子、語句、函式、陣列 一. 關鍵字 【注】關鍵字的所有的字母都是小寫  1. 用於定義資料型別的關鍵字 基本資料型別 數值型 整數:byte(位元組) sho

語法基礎(常量變數資料型別)

上一課已經學習瞭如何輸出文字並換行 這一節課來學習一下常量、變數和資料型別 首先說一下什麼是量 量是一種會佔用磁碟空間或記憶體空間的資料,量一般分為地址和值兩部分 地址: 量在計算機中儲存的位置 值: 能被用於運算的資料 簡而言之,量可以看作是一個容器,這個容

靜態連結串列插入刪除操作詳解(C語言程式碼實現)

本節主要講解靜態連結串列的插入和刪除操作,有關靜態連結串列的詳細講解請閱讀《靜態連結串列及C語言實現》一文。 在講解靜態連結串列的插入和刪除操作之前,我們假設有如下的靜態連結串列: 圖中,array[0] 用作備用連結串列的頭結點,array[1] 用作存放資料的連結串列的頭結點,array[0]