C/C++中const與define應用上該怎麼取捨

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)

    全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束後有系統釋放

  • 文字常量區

    常量字符串就是放在這裏的。 程序結束後由系統釋放

  • 程序代碼區

    存放函數體的二進制代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章