成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++內存邏輯區域劃分方式介紹

開發 后端
C++內存邏輯區域被劃分為了堆;棧;以及靜態存儲區這三種。我們今天將會針對這三種區域分別進行介紹,讓大家充分掌握這方面的知識。

C++編程語言是一門比較高深的計算機應用語言。它的很多功能都需要我們在不斷的學習與實踐過程中去探索。比如C++內存相關內容,就是其中一個重要的知識點。C++內存邏輯區域總共被分為三種:堆、棧和靜態存儲區。我們稱位于它們之中的對象分別為堆對象,棧對象以及靜態對象。#t#

C++內存邏輯區域之a棧:一般用于存放局部變量或對象,如我們在函數定義中用類似下面語句聲明的對象:

Type stack_object ;

stack_object便是一個棧對象,生命周期是從定義點開始,函數返回時,結束。幾乎所有的臨時對象都是棧對象。比如,下面的函數定義:

Type fun(Type object) ;

這個函數至少產生兩個臨時對象,首先,參數是按值傳遞的,所以會調用拷貝構造函數生成一個臨時對象object_copy1 ,在函數內部使用的不是使用的不是object,而是object_copy1,自然,object_copy1是一個棧對象,它在函數返回時被釋放;還有這個函數是值返回的,在函數返回時,如果我們不考慮返回值優化(NRV),那么也會產生一個臨時對象object_copy2,這個臨時對象會在函數返回后一段時間內被釋放。比如某個函數中有如下代碼:

Type tt ,result ; 生成兩個棧對象

tt = fun(tt) ; 函數返回時,生成的是一個臨時對象object_copy2

上面的第二個語句的執行情況是這樣的,首先函數fun返回時生成一個臨時對象object_copy2 ,然后再調用賦值運算符執行tt = object_copy2 ; 調用賦值運算符 編譯器在我們毫無知覺的情況下,為我們生成了這么多臨時對象,而生成這些臨時對象的時間和空間的開銷可能是很大的,所以,對于“大”對象最好用const引用傳遞代替按值進行函數參數傳遞了。

C++內存邏輯區域之b 堆 又叫自由存儲區,它是在程序執行的過程中動態分配的,其最大的特性就是動態性。在C++中,所有堆對象的創建和銷毀都要由程序員負責,如果處理不好,就會發生內存問題。如分配了內存而沒有釋放則造成內存泄漏;如果已釋放了對象,卻沒有將相應的指針置為NULL,則可能會造成“懸掛指針”或“野指針”,再度使用此指針時,就會出現非法訪問,嚴重時就導致程序崩潰。

C++中一般通過new來為對象分配堆內存空間(當然,用malloc也可獲得C式堆內存),并且返回指向該堆對象的指針。

C++內存邏輯區域之c 靜態存儲區 所有的靜態對象、全局對象都于靜態存儲區分配。關于全局對象,是在main()函數執行前就分配好了的。其實,在main()函數中的顯示代碼執行之前,會調用一個由編譯器生成的_main()函數,而_main()函數會進行所有全局對象的的構造及初始化工作。而在main()函數結束之前,會調用由編譯器生成的exit函數,來釋放所有的全局對象。比如下面的代碼:

  1. void main(void)  
  2. {  
  3.  … … 顯式代碼  

實際上,被轉化成這樣:

  1. void main(void)  
  2. {  
  3.  _main(); 隱式代碼,由編譯器產生,用以構造所有全局對象  
  4.  … … 顯式代碼  
  5.  … …  
  6.  exit() ; 隱式代碼,由編譯器產生,用以釋放所有全局對象  

假設我們要在main()函數執行之前做某些準備工作,那么我們可以將這些準備工作寫到一個自定義的全局對象的構造函數中,這樣,在main()函數的顯式代碼執行之前,這個全局對象的構造函數會被調用,執行預期的動作,這樣就達到了我們的目的。剛才講的是靜態存儲區中的全局對象,那么,也有對應的局部靜態對象,局部靜態對象通常也是在函數中定義的,就像棧對象一樣,只不過,其前面多了個static關鍵字。局部靜態對象的生命期是從其所在函數第一次被調用,更確切地說,是當第一次執行到該靜態對象的聲明代碼時,產生該靜態局部對象,直到整個程序結束時,才銷毀該對象。還有一種靜態對象,那就是它作為class的靜態成員。考慮這種情況時,就牽涉了一些較復雜的問題。

第一個問題是class的靜態成員對象的生命期,class的靜態成員對象隨著第一個class object的產生而產生,在整個程序結束時消亡。也就是有這樣的情況存在,在程序中我們定義了一個class,該類中有一個靜態對象作為成員,但是在程序執行過程中,如果我們沒有創建任何一個該class object,那么也就不會產生該class所包含的那個靜態對象。還有,如果創建了多個class object,那么所有這些object都共享那個靜態對象成員。

第二個問題是,當出現下列情況時:

  1. class Base  
  2. {  
  3.  public  
  4. static Type s_object ;  
  5. }  
  6. class Derived1 public Base 公共繼承  
  7. {  
  8.  … … other data   
  9. }  
  10. class Derived2 public Base 公共繼承  
  11. {  
  12.  … … other data   
  13. }  
  14. Base example ;  
  15. Derivde1 example1 ;  
  16. Derivde2 example2 ;  
  17. example.s_object = …… ;  
  18. example1.s_object = …… ;   
  19. example2.s_object = …… ;  

請注意上面標為黑體的三條語句,它們所訪問的s_object是同一個對象嗎?答案是肯定的, 我們知道,當一個類比如Derived1,從另一個類比如Base繼承時,那么,可以看作一個Derived1對象中含有一個Base型的對象,這就是一個subobject。當我們將一個Derived1型的對象傳給一個接受非引用Base型參數的函數時會發生切割,那么是怎么切割的呢?相信現在你已經知道了,那就是僅僅取出了Derived1型的對象中的subobject,而忽略了所有Derived1自定義的其它數據成員,然后將這個subobject傳遞給函數(實際上,函數中使用的是這個subobject的拷貝)。

所有繼承Base類的派生類的對象都含有一個Base型的subobject(這是能用Base型指針指向一個Derived1對象的關鍵所在,自然也是多態的關鍵了),而所有的subobject和所有Base型的對象都共用同一個s_object對象,從Base類派生的整個繼承體系中的類的實例都會共用同一個s_object對象了。

以上就是對C++內存邏輯區域的相關介紹。

責任編輯:曹凱 來源: 博客園
相關推薦

2011-06-21 11:16:24

cc++

2011-04-13 16:50:54

CC++內存

2010-01-25 14:56:08

C++程序

2010-02-03 15:11:53

C++內存區域

2010-02-04 14:29:45

C++ typenam

2010-02-06 16:21:35

C++常規DLL

2010-02-04 15:41:10

C++內存管理

2021-11-26 00:00:48

JVM內存區域

2024-11-15 09:14:23

JDK4NIO函數

2010-01-22 13:31:58

C++標準庫

2011-06-21 10:17:41

c++內存模型

2024-11-13 11:12:08

JVM內存區域

2010-01-15 15:52:18

CC++

2010-01-15 10:41:06

CC++

2010-02-04 10:33:40

C++異常傳遞

2010-02-02 09:43:27

C++存儲區域

2010-01-26 10:27:43

C++語言

2009-08-19 09:57:01

C++ RAII

2011-07-20 15:08:22

C++

2010-01-18 10:16:58

學習C++
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情 一区 | 久久精品国产亚洲夜色av网站 | 91 在线 | 日本淫视频 | 日韩视频在线一区 | 国产精品美女久久久久久免费 | 久久精品欧美电影 | 高清久久 | 综合二区| 国产精品国产三级国产aⅴ中文 | 中文字幕精品一区二区三区精品 | 日韩视频一区二区在线 | 国产欧美一区二区三区另类精品 | 国产传媒在线播放 | 精品久久久久久久人人人人传媒 | 色综合欧美 | 欧美福利久久 | 成人网在线观看 | 成人一区二区三区视频 | 亚洲人成人一区二区在线观看 | 欧美激情在线精品一区二区三区 | 亚洲黄色片免费观看 | 久久福利电影 | jdav视频在线观看免费 | aaa综合国产 | 99国产视频 | 日韩精品在线一区二区 | 午夜寂寞福利视频 | 视频一区二区在线观看 | 久久久久久久国产精品视频 | 成年男女免费视频网站 | 国产久| 中文字幕国产视频 | japanhd美女动 | 大陆一级毛片免费视频观看 | 91精品久久久久久久99 | 久久久久国产 | 日韩一级免费观看 | 国产激情91久久精品导航 | 免费的日批视频 | 国产福利91精品 |