C程式記憶體的分配,const ,volatile,static
一個c/c++程式佔用的記憶體分別位以下幾個部分
1.棧區:由編譯器自動分配釋放,儲存為函式而分配的區域性變數,函式引數,返回資料,返回地址等,其操作方式類似於資料結構裡的棧
2.堆區:一般由程式設計師手動分配釋放,若程式設計師不釋放程式結束時可能由OS回收。
3.全域性區(靜態區):由於存放全域性變數,靜態變數常量,程式結束後由系統釋放
4.常量區:用於儲存常量字串
5程式碼區:用於存放函式體(類成員函式和全域性函式)的二進位制程式碼
這並不是真正的實體地址,一個計算機中可以有多個程式在執行,而每一個程式都有一個執行時堆疊,而實體記憶體只有一個,這只是一個虛擬地址
記憶體分配的三種方式:
1.從靜態區分配:記憶體在程式編譯的時候就已經分配好了,這塊記憶體在程式的整個執行期間都存在,例如:全域性變數,static變數
2.在棧上分配:效率高,但是棧的空間有限,執行時建立,執行結束後系統自動釋放。棧時向下生長的,先定義的變數地址高,後定義的變數地址低,但是在棧上定義的陣列的地址是由低向高的,因為陣列一次性開闢一整塊空間,然後分配給陣列內的元素。
3.在堆上分配:也稱為動態記憶體分配,堆是自下向上生長的,變數的地址一次增大。用malloc()或new()申請任意空間,程式設計師自己負責在何時用free()/delete()釋放記憶體。動態記憶體的生命週期由程式設計師自己負責,使用非常靈活。但是一定要記得回收,不然可能會產生記憶體洩漏的問題。頻繁分配、釋放不同大小的空間還有可能導致記憶體碎片的問題。
const、volatile關鍵字
const:修飾變數,使變數具有常性。編譯器會在編譯時進行優化,將const變數放入暫存器
#include<stdio.h>
int main()
{
const int num = 10;
int *p = (int*)#
*p = 20;
printf("%d",num);
return 0;
}
//輸出仍然為10 ,為什麼呢?
編譯器在編譯期間會對程式碼進行優化,當編譯器看到num被const修飾時,就會將num的值放在暫存器中(以提高訪問的效率),以後只要使用num就會區暫存器裡面取,所以即使改變了num對應的記憶體中的值,暫存器也感知不到,所以就會輸出10。
但我們對程式碼做如下修改:
#include<stdio.h>
int main()
{
volatile const num = 10;
int *p = (int*)#
*p = 20;
printf("%d",num);
return 0;
}
//這樣對*p做修改時num就等於20,為什麼呢?
volatile:保證記憶體的可見性,使編譯器在編譯時不進行優化,執行時不快取,每次都去記憶體中讀出。
static:
- 修飾函式:改變其連結屬性,由外部連結屬性-->內部連結屬性(函式只能在當前原始檔內使用,不能在其他原始檔內使用),儲存型別(生命週期)和作用域不受影響
- 修飾變數:
1)全域性變數:與修飾函式的作用一致,改變其連結屬性(外->內),儲存型別和作用域不受影響
2)區域性變數:改變其生命週期(儲存型別),由自動變數變成了靜態變數,作用域和連結屬性不受影響
相關文章
- C語言的記憶體分配C語言記憶體
- C中的記憶體分配模型記憶體模型
- C語言-記憶體分配C語言記憶體
- C++動態記憶體分配C++記憶體
- C/C++記憶體分配以及釋放C++記憶體
- mimalloc記憶體分配程式碼分析記憶體
- C++ 指標動態記憶體分配C++指標記憶體
- volatile的記憶體屏障的坑記憶體
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- C++ 類的記憶體分配是怎麼樣的?C++記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- 動態記憶體分配記憶體
- C/C++使用malloc為結構體陣列分配記憶體(及free釋放記憶體)的三種方法C++結構體陣列記憶體
- java-方法記憶體分配Java記憶體
- go記憶體分配器Go記憶體
- java基礎-記憶體分配Java記憶體
- hadoop 記憶體分配規則Hadoop記憶體
- 記憶體分配策略學習記憶體
- 深度理解glibc記憶體分配記憶體
- Volatile之Java記憶體模型概念Java記憶體模型
- Netty 中的記憶體分配淺析Netty記憶體
- Go記憶體分配和GC的理解Go記憶體GC
- volatile的記憶體語義與應用記憶體
- C++ 動態記憶體分配與名稱空間C++記憶體
- C程式記憶體佈局C程式記憶體
- Java記憶體模型(MESI、記憶體屏障、volatile和鎖及final記憶體語義)Java記憶體模型
- c程式的記憶體佈局圖C程式記憶體
- 【Java】 記憶體分配全面淺析Java記憶體
- JVM GC 與 記憶體分配策略JVMGC記憶體
- 記憶體分配問題處理記憶體
- [20210126]探究oracle記憶體分配.txtOracle記憶體
- Java記憶體模型——volatile關鍵字Java記憶體模型
- [20191114]linux記憶體分配的討論.txtLinux記憶體
- new、delete、記憶體分配 的底層原理delete記憶體
- javascript堆疊記憶體分配的區別JavaScript記憶體
- MySQL 配置InnoDB的記憶體分配器MySql記憶體
- 微軟的HotSpot C2可減少15%堆記憶體分配微軟HotSpot記憶體