記憶體空間,資料型別,static作用

2021-09-25 13:03:47 字數 2372 閱讀 5987

記憶體圖

一、程式的記憶體分配

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分:

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

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

3、全域性區(靜態區)(static)— 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後有系統釋放

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

5、程式**區 — 存放函式體的二進位制**。

在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態 

儲存區和常量儲存區。  

(1)棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數 的儲存區。裡面的變數通常是區域性變數、函式引數等。  

(2)堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉, 那麼在程式結束後,作業系統會自動**。  

(3)自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的, 不過它是用free來結束自己的生命的。  

(4)全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的 c語言中,全域性變數又分為初始化的和未初始化的(初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數與靜態變數在相鄰的另一塊區域,同時未被初始化的物件儲存區可以通過void*來訪問和操縱,程式結束後由系統自行釋 放),在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。  

(5)常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許 修改(當然,你要通過非正當手段也可以修改,而且方法很多)

豎向箭頭:低位元組向高位元組進行轉換

橫向箭頭:不管是不是進行混合運算,勢必會進行的一種轉換

比如:char 和 unisgned char在進行運算時,都先會轉換成int型別  

int和unsigned int的混合運算  ---》相加的結果是unsigned int型別

char和unsigned char的混合運算  ---》相加的結果是int型別

全域性變數:定義在函式體外部的變數

區域性變數:定義在函式體內部的變數

儲存型別:auto  register  static  extern

auto:自動的,宣告的變數都存放在棧區

auto只能修飾區域性變數,且可以省略

總結:所有的區域性變數,都是存放在棧區,並且是由系統自動開闢與釋放的

register:暫存器,想要將定義的變數存放在cpu內部的暫存器中,執行速度快,提高程式執行效率,

但是暫存器數量很少,所以只是建議將變數存放在暫存器中,如果申請不到就同auto

前提:乙個程式(a.out)可以由多個.c檔案共同生成

全域性變數中全域性的範圍是整個程式,也就是假設有個程式由1.c和2.c共同生成,

1.c中定義的全域性變數,在2.c中可以使用,但是要提前說明該變數在外部已經定義好了

注意:編譯時兩個檔案同時編譯,才能生成乙個a.out

在2.c中宣告:

extern int a; //告訴編譯器,a這個變數已經在外部定義過了,可以直接使用

定義和宣告本質區別:定義會分配記憶體,而宣告只是進行乙個說明,不會分配記憶體

extern:外部的

注意:extern修飾變數時,只能用來乙個全域性已經定義過的外部變數

static的作用:

1、static在修飾全域性變數時,只能在本檔案內使用,限制了作用域

2、static在修飾區域性變數時,如果該區域性變數沒有被初始化,其值為0,並且延長了該區域性變數的生命週期

3、static在修飾函式時,該函式只能夠在本檔案內使用

2、生命週期和作用域

區域性變數:

生命週期:從定義時開始,到該模組結束

作用域:該模組內

static修飾的區域性變數:

生命週期:從定義時開始,到該程式結束

作用域:該模組內

全域性變數:

生命週期:從定義時開始,到程式結束

作用域:整個程式

static修飾的全域性變數:

生命週期:從定義開始,到程式結束

作用域:所在檔案內

orical空間資料型別GEOMETRY使用乾貨

最近專案應用到了根據geometry型別資料範圍內查詢更新資料的操作,對於此種資料型別的小白,在這兩天惡補了一些相關知識,做一些簡單的分享。geometry資料型別簡介 可以參考這篇文章和以上了解基本資料格式和內容,下面直接上應用乾貨。在專案應用中多為構建多邊形與位置資料,或通過位置資訊對資料進行操...

空間資料庫學習筆記 二 空間資料型別

一 空間資料庫型別 1 geometry 資料型別 支援平面或歐幾里得 平面球 資料 2 geography 資料型別 符合適用於 sql 規範的開放地理空間聯盟 ogc 簡單特徵 1.1.0 版。可儲存諸如 gps 緯度和經度座標之類的橢圓體 圓球 資料 二 geometry和geography層...

mysql空間資料型別解釋 MySQL空間資料型別

mysql空間資料型別講解 mysql具有與opengis類對應的資料型別。某些型別只能儲存單個幾何值 geometry point linestring polygon geometry能夠儲存任何型別的幾何值。其他的單值型別point linestring以及polygon只能儲存特定幾何型別的...