1.define和const機制
define是在預編譯的時候展開替換的,const是編譯運行階段使用。
define沒有類型,不做類型檢查處理。只是替換。const常量有具體的類型,在編譯的時候會進行類型檢查。
define宏定義僅僅是替換宏定義不分配內存,變量定義分配內存,const會在內存中分配。
2.內存管理
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此時並未將Pi放入ROM中
double i=Pi; //此時爲Pi分配內存,以後不再分配!
double I=PI; //編譯期間進行宏替換,分配內存
double j=Pi; //沒有內存分配
double J=PI; //再進行宏替換,又一次分配內存!
const更節省空間,避免不必要的內存分配。選擇const比define更省空間
@3.堆棧@
從彙編層面上講,棧是機器系統提供給我們的數據結構,堆是我們通過C/C++函數去申請開闢的數據結構。
數據結構上來說,棧是個先進後出的線性表,存儲方式上又分了順序棧、鏈式棧。堆則是二叉樹的一種。一般用到的排序都是堆排序。
內存管理上,棧會自動回收,堆需要我們自己管理。
一個由C/C++編譯的程序佔用的內存分爲以下幾個部分
棧區(stack)
由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
堆區(heap)
一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
全局區(靜態區)(static)
全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束後有系統釋放
文字常量區
常量字符串就是放在這裏的。 程序結束後由系統釋放
程序代碼區
存放函數體的二進制代碼。