const 與 static

const static char *str = "hello world"!

把 const 與 static 連在一起用有什麼特別的意思呢?表示在該文件作用域中的常量,對該文件外的函數不可見

 

const與static變量分別位於程序的哪個區域呢?

一個由C/C++編譯的程序佔用的內存分爲以下幾個部分  
  1)、棧區(stack)—   由編譯器自動分配釋放   ,存放函數的參數值,局部變量的值等。其  
  操作方式類似於數據結構中的棧。  
  2)、堆區(heap)   —   一般由程序員分配釋放,   若程序員不釋放,程序結束時可能由OS回  
  收   。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。  
  3)、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的  
  全局變量和靜態變量在一塊區域,   未初始化的全局變量和未初始化的靜態變量在相鄰的另  
  一塊區域。   -   程序結束後由系統釋放。  
  4)、文字常量區   —常量字符串就是放在這裏的。   程序結束後由系統釋放  
  5)、程序代碼區—存放函數體的二進制代碼。  

 

所以,一般來說都是放在靜態區。

windows和Linux上的程序在內存中的結構是怎麼樣的?

瞭解程序在內存中的組成對優化和調試有很大的幫助。通過gcc的objdump可以把程序的組成顯示出來,看一下是否有很大的const變量佔據了內存。在windows中如何查看呢?

還有就是如何判斷堆棧溢出,一般來說一個線程規定了自身棧空間的大小,當程序crash時,可以通過指針地址判斷crash是否是因爲棧溢出造成的。所以問題就是如何知道當前線程的棧基址呢?程序是如何被load到內存中?指令如何被執行?線程如何被創建?線程以何種方式存在於內存之中呢?

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