亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深度探索C++對象模型(9)

2019-11-17 05:16:19
字體:
來源:轉載
供稿:網友
介紹

  當編譯一個C++程序時,計算機的內存被分成了4個區域,一個包括程序的代碼,一個包括所有的全局變量,一個是堆棧,還有一個是堆(heap),我們稱堆是自由的內存區域,我們可以通過new和delete把對象放在這個區域。你可以在任何地方分配和釋放自由存儲區。但是要注重因為分配在堆中的對象沒有作用域的限制,因此一旦new了它,必須delete它,否則程序將崩潰,這便是內存泄漏。(C#已經通過內存托管解決了這一令人頭疼的問題)。C++通過new來分配內存,new的參數是一個表達式,該表達式返回需要分配的內存字節數,這是我以前把握的關于new的知識,下面看看通過這本書,使我們能夠更進一步的了解到些什么。   這一章主要是說Runtime Semantics執行期語義學?! ∵@是我們平時寫的程序片段:
Matrix identity; //一個全局對象
Main()
{
Matrix m1=identity;
……
return 0;
}  很常見的一個代碼片段,雷神從來沒有考慮過identity如何被構造,或者如何被銷毀。因為它肯定在Matrix m1=identity之前就被構造出來了,并且在main函數結束前被銷毀了。我們不用考慮這些問題,好象C++就應該這樣。但這本書是研究C++底層機制的。既然我們在看這本書,說明我們希望了解C++的編譯器又做了那些大量的工作,使得我們可以這樣使用對象?! ≡贑++程序中所有的全局對象都被放在data segment中,假如明確賦值,則對象以該值為初值,否則所配置到內存內容為0。也就是說,假如我們有以下定義

  Int v1=1024;
  Int v2;

  則v1和v2都被配置于data segment,v1值為1024,v2值為0。(雷神在VC6環境用MFC編程時中發現假如int v2;v2的值不為0,而是-8,不知為什么?編譯器造成的?)?! 〖偃缬幸粋€全局對象,并且這個對象有構造函數和析構函數的話,它需要靜態的初始化操作和內存釋放工作,C++是一種跨平臺的編程語言,因此它的編譯器需要一種可以移植的靜態初始化和內存釋放的方法。下面便是它的策略。

  1、為每一個需要靜態初始化的檔案產生一個_sit()函數,內帶構造函數或內聯的擴展。
  2、為每一個需要靜態的內存釋放操作的文件中,產生一個_std()函數,內帶析構函數或內聯的擴展。
  3、提供一個_main()函數,用來調用所有的_sti()函數,還有一個exit()函數調用所有的_std()函數。

  侯先生說:

  Sit可以理解成static initialization的縮寫。
  Std可以理解成static deallocation的縮寫。

  那么main函數會被編譯器變成這樣:
Matrix identity; //一個全局對象
Main()
{
_main();//對所有的全局對象做static initialization動作。
Matrix m1=identity;
……
exit();//對所有的全局對象做static deallocation動作。
}
其中_main()會有一個對identity對象的靜態初始化的_sti函數,象下面偽碼這樣:
// matrix_c是文件名編碼_identity表示靜態對象,這樣能夠保證向執行文件提供唯一的識別符號
_sti__matrix_c_identity()
{
identity.Matrix:: Matrix(); //這就是靜態初始化
}  相應的在exit()函數也會有一個_std_matrix_c_identity(),來進行static deallocation動作。
但是被靜態初始化的對象有一些缺點,在使用異常時,對象不能被放置在try區段內。還有對象的相依順序引出的復雜度,因此不建議使用需要靜態初始化的全局對象。  局部靜態對象在C++底層機制是如何構造和在內存中銷毀的呢?

  1、導入一個臨時對象用來保護局部靜態對象的初始化操作。
  2、第一次處理時,臨時對象為false,于是構造函數被調用,然后臨時對象被改為true.
  3、臨時對象的true或者false便成為了判定對象是否被構造的標準。
  4、根據判定的結果決定對象的析構函數是否執行?! 〖偃缫粋€類定義了構造函數或者析構函數,則當你定義了一個對象數組時,編譯器會通過運行庫將你的定義進行加工,例如:
point knots[10]; //我們的定義
vec_new(&knots,sizeof(point),10,&point::point,0); //編譯器調用vec_new()操作?! ∠旅娼o出vec_new()原型,不同的編譯器會有差別。
void * vec_new(
void *array, //數組的起始地址
size_t elem_size, //每個對象的大小
int elem_count, //數組元素個數
void(*constrUCtor)(void*),
void(*destructor)(void* ,char)
)
對于明顯獲得初值的元素,vec_new()不再有必要,例如:
point knots[10]={
Point(), //knots[0]
Point(1.0,1.0,0.5), //knots[1]
-1.0 //knots[2]
};
會被編譯器轉換成:
//C++偽碼
Point::Point(&knots[0]);
Point::Point(&knots[1],1.0,1.0,0.5);
Point::Point(&knots[2],-1.0,0.0,0.0);
vec_new(&knots,sizeof(point),10,&point::point,0); //剩下的元素,編譯器調用vec_new()操作。
  怎么樣,很神奇吧?! ‘斁幾g一個C++程序時,計算機的內存被分成了4個區域,一個包括程序的代碼,一個包括所有的全局變量,一個是堆棧,還有一個是堆(heap),我們稱堆是自由的內存區域,我們可以通過new和delete把對象放在這個區域。你可以在任何地方分配和釋放自由存儲區。但是要注重因為分配在堆中的對象沒有作用域的限制,因此一旦new了它,必須delete它,否則程序將崩潰,這便是內存泄漏。(C#已經通過內存托管解決了這一令人頭疼的問題)。C++通過new來分配內存,new的參數是一個表達式,該表達式返回需要分配的內存字節數,這是我以前把握的關于new的知識,下面看看通過這本書,使我們能夠更進一步的了解到些什么。

  Point3d *origin=new Point3d; //我們new 了一個Point3d對象

  編譯器開始工作,上面的一行代碼被轉換成為下面的偽碼:
Point3d * origin;
If(origin=_new(sizeof(Point3d)))
{
try{
origin=Point3d::Point3d(origin);
}
catch(…){
_delete(origin);
throw;
}
}  而delete origin;

  會被轉換成(雷神將書上的代碼改為exception handling情況):
if(origin!=0){
try{
Point3d::~Point3d(origin);
_delete(origin);
catch(…){
_delete(origin); //不知對否?
throw;
}
}  一般來說對于new的操作都直截了當,但語言要求每一次對new的調用都必須傳回一個唯一的指針,解決這個問題的辦法是,傳回一個指針指向一個默認為size=1的內存區塊,實際上是以標準的C的malloc()來完成。同樣delete也是由標準C的free()來完成。原來如此?! ∽詈筮@篇筆記再說說臨時對象的問題。

  T Operator+(const T&,const T&); //假如我們有一個函數

  T a,b,c; //以及三個對象:

  c=a+b;

  //可能會導致臨時對象產生。用來放置a+b的返回值。然后再由 T的copy constructor把臨時對象當作c的初值。也有可能直接由拷貝構造將a+b的值放到c中,這時便不需要臨時對象。另外還有一種可能通過操作符的重載定義,經named return value優化也可以獲得c對象。這三種方法結果一樣,區別在于初始化的成本。對臨時對象書上有很好的總結:

  在某些環境下,有PRocessor產生的臨時對象是有必要的,也是比較方便的,這樣的臨時對象由編譯器決定。

  臨時對象的銷毀應該是對完整表達式求值過程的最后一個步驟。

  因為臨時對象是根據執行期語義有條件的產生,因此它的生命規則就顯得很復雜。C++標準要求凡含有表達式執行結果的臨時對象,應該保留到對象的初始化操作完成為止。當然這樣也會有例外,當一個臨時對象被一個引用綁定時,對象將殘留,直到被初始化的引用的生命結束,或者超出臨時對象的作用域。  好了今天很有收獲,馬上就會結束這本書的學習了。下一章的標題 站在對象模型的尖端 我有些迫不及待了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合久久88色综合天天看泰| 国产美女精彩久久| 久久亚洲电影天堂| 国模极品一区二区三区| 欧美成人午夜激情视频| 性视频1819p久久| 91九色视频导航| 久久久99免费视频| 国产视频亚洲视频| 亚洲a中文字幕| 国产一区av在线| 精品国产一区二区三区久久久| 国产精品精品久久久久久| 在线日韩日本国产亚洲| 亚洲欧美另类自拍| 国模精品系列视频| 久久精品亚洲94久久精品| 成人乱人伦精品视频在线观看| 久久亚洲国产成人| 丝袜美腿精品国产二区| 国产日韩视频在线观看| 日韩风俗一区 二区| 亚洲黄色av女优在线观看| 久久中文字幕一区| 欧美午夜久久久| 亚洲天堂免费在线| 色婷婷av一区二区三区久久| 中文字幕亚洲一区在线观看| 高清日韩电视剧大全免费播放在线观看| 国产精品在线看| 一区二区欧美久久| 亚洲91精品在线观看| 国内精品久久久久影院优| 最近中文字幕2019免费| 欧美性生交xxxxx久久久| www.xxxx欧美| 亚洲区一区二区| 中文字幕欧美日韩va免费视频| 国产69久久精品成人| 永久免费精品影视网站| 日本精品性网站在线观看| 亚洲www视频| 日韩精品在线播放| 91日韩在线视频| 欧美日韩午夜剧场| 欧美裸体xxxxx| 538国产精品一区二区在线| 日韩国产在线看| 国产精品成人品| 亚洲free性xxxx护士hd| 国产热re99久久6国产精品| 亚洲经典中文字幕| 亚洲成人中文字幕| 精品亚洲aⅴ在线观看| 国产成人精品视频在线| 亚洲开心激情网| 97香蕉久久超级碰碰高清版| 在线精品国产成人综合| 日本三级久久久| 一个人看的www欧美| 成人h片在线播放免费网站| 亚洲一区二区三区在线视频| 国产ts人妖一区二区三区| 久久久视频精品| 久久精品小视频| 国产精品69精品一区二区三区| 欧美激情免费视频| 69av在线视频| 欧美性xxxxxxxxx| 国产日韩精品在线播放| 欧美自拍大量在线观看| 欧美精品videos另类日本| 欧美天堂在线观看| 日韩不卡在线观看| 精品自拍视频在线观看| 亚洲精品日韩av| 日韩毛片中文字幕| 超碰91人人草人人干| 亚洲视频在线观看| 国产精品日韩欧美| 97成人精品视频在线观看| 95av在线视频| 久久久www成人免费精品| 成人黄色片网站| 91香蕉嫩草影院入口| 久久免费高清视频| 亚洲人成77777在线观看网| 亚洲欧美日韩图片| 精品国产一区二区三区久久久| 日本欧美一二三区| 欧美日韩另类在线| 蜜臀久久99精品久久久无需会员| xxav国产精品美女主播| 在线观看日韩www视频免费| 欧美另类极品videosbestfree| 日本久久91av| 久久久久久久久久久人体| 国产精品福利观看| 国产美女被下药99| 亚洲第一区第二区| 久久偷看各类女兵18女厕嘘嘘| 欧美高清视频一区二区| 欧美电影在线免费观看网站| 亚洲欧洲黄色网| 91精品久久久久久久久久入口| 欧美激情伊人电影| 欧美成人在线免费视频| 91精品国产99久久久久久| 国产亚洲人成网站在线观看| 亚洲综合小说区| 丝袜亚洲另类欧美重口| 国产三级精品网站| 在线电影欧美日韩一区二区私密| 91精品国产综合久久久久久久久| 欧美美女操人视频| 久久久亚洲福利精品午夜| 亚洲日本欧美中文幕| 亚洲直播在线一区| 精品久久久在线观看| 久热精品视频在线免费观看| 色综合久久天天综线观看| 欧美寡妇偷汉性猛交| 国产精品欧美亚洲777777| 欧美日本啪啪无遮挡网站| 欧美激情区在线播放| 91视频免费网站| 久久综合伊人77777尤物| 亚洲乱码国产乱码精品精天堂| 在线免费看av不卡| 亚洲国产精品久久久久久| www.国产精品一二区| 亚洲国产精品推荐| …久久精品99久久香蕉国产| 国产欧美精品一区二区三区介绍| 欧美一级片一区| 亚洲精选一区二区| 91九色国产在线| 亚洲人午夜精品| 亚洲日本成人网| 久久久久久久久网站| 久久久久久成人精品| 动漫精品一区二区| 国产日韩精品电影| 国产精品永久免费在线| 欧美黑人一级爽快片淫片高清| 亚洲精品影视在线观看| 视频在线观看99| 国产精品亚洲综合天堂夜夜| 欧洲成人午夜免费大片| 久久久久久久久久久久久久久久久久av| 亚洲**2019国产| www.欧美精品一二三区| 欧美大片大片在线播放| 亚洲国产另类 国产精品国产免费| 成人妇女淫片aaaa视频| 欧洲一区二区视频| 久久久久久国产免费| 91在线精品视频| 日韩日本欧美亚洲| 亚洲男人天堂2019| 成人午夜两性视频| 色爱av美腿丝袜综合粉嫩av| 国产精品国产亚洲伊人久久| 欧美日韩爱爱视频|