1. 程式人生 > >【C++學習】變數和儲存區

【C++學習】變數和儲存區

儲存區一般分為以下五種:
棧區:
由編譯器在需要的時候進行分配,不需要的時候會自動清空,棧區一般比較小,對於較大的陣列不應該放入棧區。
堆區:
由new分配的空間,他們的釋放由程式中的語句進行操作。由delete釋放,如果沒有釋放,就會在程式結束時自動回收。
程式碼區:
存放程式碼的二進位制程式碼。
全域性(靜態)儲存區:
全域性變數和靜態變數被分配到同一塊記憶體中。
常量儲存區:
存放的資料都是常量,不允許被修改。

重點一:堆疊的區別
1.管理方式不同:
棧區是系統自動進行分配釋放的。
堆區是手動分配釋放。
2.空間問題:
堆是採用佇列優先的方式進行的,如果大量的進行new和delete就會造成記憶體空間的間斷性,產生很多空間記憶體碎片。
3.生長方向:
對於堆來講,生長方向是向上的,也就是向著記憶體地址增加的方向;對於棧來講,它的生長方向是向下的,是向著記憶體地址減小的方向增長。
4.分配效率:
棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是函式庫提供的,它的機制是很複雜的。總之,棧效率高於堆效率。(而且堆空間會有很多碎片,所以分配大空間效率很低)

如果堆疊一起說就是表示棧,而不是堆。

重點二:堆和自由儲存區的區別
這個問題沒必要糾結,有的地方進行了有的地方都歸屬為堆。(這個是取決與malloc與new的實現機制)

重點三:靜態儲存方式和動態儲存方式(按照時間)
靜態儲存方式就是指在程式執行期間分配固定的儲存空間的方式。(eg.全域性變數)
動態儲存方式就是指在程式執行過程中,使用的時候才分配儲存單元,使用完立即釋放。
典型的例子就是呼叫函式,形參只有在呼叫的時候才會分配,呼叫結束就會釋放。
生命期表示了變數的存在時間。

重點四:全域性變數和區域性變數(按照空間)
全域性變數既可以是某物件函式建立,也可以是在本程式任何地方建立。
區域性變數是指由某物件或某個函式所建立的變數,只能被內部引用,而無法被其它物件或函式引用。

重點五:儲存型別說明:
auto 自動變數
register 暫存器變數
extern 外部變數
static 靜態變數
自動變數和暫存器變數屬於動態儲存方式, 外部變數和靜態變數屬於靜態儲存方式。
所以,靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。

相關推薦

C++學習變數儲存區

儲存區一般分為以下五種: 棧區: 由編譯器在需要的時候進行分配,不需要的時候會自動清空,棧區一般比較小,對於較大的陣列不應該放入棧區。 堆區: 由new分配的空間,他們的釋放由程式中的語句進行操

C#學習繼承多型

建構函式和解構函式的呼叫順序 建構函式和解構函式的呼叫順序相反,建構函式從基類到派生類依次呼叫,解構函式反過來。 抽象類和抽象方法 抽象方法必須包含在抽象類中,也就是說,一旦一個類包含抽象方法,就應該被宣告為抽象類。 抽象類用 abstract 修飾,無法用new 來例項化。但可以用抽象類的引用

C#學習delegate(委託) event(事件)

C# 中的委託(Delegate)類似於 C 或 C++ 中函式的指標。委託(Delegate) 是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。在C#中方法不能作為引數直接傳遞,必須使用委託(用來委託方法)。delegate(委託)是一種特殊的引用型別,它將方法也作為特殊的物件封裝

C++學習vector的使用,輸入一串數字,輸出相鄰---ShinePans

/* *連續使用cin輸入,輸入進vector,輸入一串數字,輸出相鄰和 */ #include <iostream> #include <string> #include <vector> #include <cctype>

C++11unoedered_mapmap(部分轉載)

好的 hash 比較 綜合 per 百萬 一點 應該 .net 1.結論 新版的hash_map都是unordered_map了,這裏只說unordered_map和map. 運行效率:unordered_map最高,而map效率較低但提供了穩定效率和有序的序列。 占用內存

C++初學物件定義與建構函式

一.類和物件定義 class 型別名 { public: 公有成員(外部介面) private: 私有成員(只允許類內函式訪問,有後續操作) protected: 保護成員 二.建構函式 def:給物件進行初始化的函式。 gra: 函式名與類名相同; 無返回值(return); 1.委託

C語言definetypedef的區別

#define是 巨集定義命令,#define DINT int相當於將程式碼中的int可以寫為DINT,DINT等價於int。typedef int TINT; 是型別定義,TINT型別的變數就是int型別的變數。 1.typedef int TINT; 和#define

C學習全通紙筆王網上閱卷系統 APMS_Setup.exe IP修改程式

前段時間用APMS遠端改卷,發現瀏覽器需要安裝閱卷外掛,安裝的過程提示IP無效,無法正常安裝外掛。後來用UEdit開啟可見.exe檔案中已經內建配置好的IP地址,可以通過修改為指定的IP後,便可以在本地正常安裝外掛並正常進入閱卷系統了。 為了方便起見,用C和C#以及Delphi寫了一份程式碼

C++ 學習筆記 變數基本型別(一)

C++ 學習筆記 一、變數和基本型別概述 型別是所有程式的基礎。型別告訴我們資料代表什麼意思以及可以對資料執行哪些操作。 c++基本型別: 字元型 整型 浮點型 c++ 還提供了可用於自定義資料型別的機制,標準庫正式利用了這些機制定義了許多更復雜的型別,比如可變長字串string 和vector等。此外,

unix學習程序檔案備份壓縮打包

程序 nice value -20 – 19之間 表示程序的優先順序,nice值越小,代表優先順序越高,執行越早。 當設定優先順序的nice值時,最低只能是0,當小於0時報錯了。 [s14516@gdufs]$nice -n -20 fi

C語言指標陣列的區別聯絡

1.指標    int  *  p     ( 這裡定義一個指標      p為指標變數     指向的是某一個地址)                2.陣列      int  arr [10]         這裡定義了10個int 型別的資料  可以通過arr[0] 

前端面試變數型別計算

1.題目 1.JS使用typeof能得到哪些型別 === 和 == 的選擇 JS中有哪些內建函式 JS變數按儲存方式分為哪些型別,並描述其特點 如何理解JSON 2.知識點 2.1 值型別和引用型別 值型別(boolean,string,

C語言巨集函式的區別

由之前的巨集的引入我們知道,巨集函式可以完成一些簡單的運算。那是不是巨集函式就可以取代函式呢?巨集函式和函式到底有哪些區別呢? 下面我們來分析他們其中的區別。 1.程式碼長度:   對於巨集,每次使用時,巨集程式碼都被插入到程式中。除了非常小的巨集之外,程式的長度將大幅度增

tensorflow 學習 name_scopevariable_scope的區別

在tensorflow中,有兩個scope, 一個是name_scope一個是variable_scope,這兩個scope到底有什麼區別呢?  三個例子 先看第一個程式: with tf.name_scope("hello") as name_scope: a

C語言malloc()free()函式的講解以及相關記憶體洩漏問題

1、函式原型及說明: void *malloc(long NumBytes):該函式分配了NumBytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回一個空指標(NULL)。 關於分配失敗的原因,應該有多種,比如說空間不足就是一種。 void free(void *FirstByte): 該

C++學習之如何用系統日期時間給檔案命名

參考的網上的模板,直接給出程式: #include "ctime" #include "time.h" using namespace std; string int2string(int value) { stringstream ss;

C#學習從泛型集合到強制轉換,start brain storm~

        大話設計模式的時候,提到了一個迭代器模式,由於高階語言對迭代器模式功能進行了很好的封裝,所以這個模式就不太常用。不過,我想說的重點是,迭代器模式裡提到的一個概念“非泛型集合”。由於不明白什麼意思,於是我就去問了度娘。不過我發現“泛型集合”比非泛型集合更有料。   泛型集合        

C++學習如何在Clion中生成多個可執行檔案

在構建一個新的Clion工程的時候,會自動生成一個資料夾cmake-build-debug,可以幫助我們快速的對整個C++工程進行編譯執行。而主函式編譯後生成的可執行檔案就位於cmake-build-d

資料結構C++STLFIFO佇列

其實我就是水一發部落格 STL中自帶的棧和佇列 庫分別是stack和queue 支援的最主要的三個操作就是push pop 和top(front) push是在棧或者佇列的頂端放入一組資料 pop在棧中是取出頂端的一組資料 而在佇列中是取出最底端的元素

C#總結settergetter方法 ToString方法

C#中方法名字都是大寫開頭的 String就是string的一個別名。String是.net框架中的,string是C#中的 屬性就是保護欄位的就是一些setter和getter方法 class Person { private Stri