C++物件模型之六 執行期筆記 (轉)
C++模型之六 執行期筆記:namespace prefix = o ns = "urn:schemas--com::office" />
1 物件的構造和析構
儘可能地把物件的宣告放在使用它的那個區段附近。
foo()
{
Point pointa; //馬上構造
if ( cache)
return 1; // 這裡會析構是多餘的,而且是浪費的
pointa.run()
return 0; //這裡也會析構是正常的。
}
foo()
{
if ( cache)
return 1; // 這裡就不會了
Point pointa; //馬上構造
pointa.run()
return 0; //這裡也會析構是正常的。
}
2 全域性物件
一般會對沒有初始化的物件自動初始化為零。在主程式裡最前面初始化這些全域性物件,在程式退出之前將會自動地釋放全域性物件。
3 物件陣列
point konts[10];
假如point 有構造和析構的話,將輪流構造或析構每個物件。假如有虛基類將採用vec_vnew()來構造否則是vec_new().
Void *vec_new ( void *array, size_t elem_size,int elem_count, void(*構造)(void*),void(*析構) (void * char))
Void * vec_delete(void *array,size_t elem_size,int elem_count,void(*析構)(void *,char));
point konts[10];
Vec_new( &kontes,sieof ( point ),10,&point::point,0);
假如:point konts[10]={point(),point(1.0,1.0,0.5),-1.0};
對於那些明顯獲得初值的元素,vec_new不再有必要了,但是對於那些沒有初始化的vec_new還是有必要。
4 new 和 delete
int *pi = new int (5);
delete pi;
變為:
int *pi;
if ( pi = _new ( sizeof (int) ) )
*pi = 5;
if ( pi !=0)
_delete ( pi );
假如是物件話
point3d *orgin = new point3d; è if( origin = _new (sizeof(point3d))) origin = point3d::pointed(origin);
異常下:
if ( origin = _new (sizeof(point3d)))
{ try { origin = point3d::point3d ( origin ); }
catch (…) { _delete (origin); throw; }
}
delete origin;è if (origin !=0) { point3d::~point3d(origin); _delete (origin);}
陣列new
int * p_array = new int [5];è int *p_array=(int*)_new(5*sizeof(int));
假如它不是類物件,或者類物件沒有建構函式的話 vec_new不會,只是單純地獲得釋放。
Point3d *p_array = new point3d [10]; è
Point3d *p_array;
P_array=vec_new(0,sizeof(point3d),10,&point3d::point3d,&point3d::~piont3d);
預先定義好的過載new
void * operator new ( size_t, void *p ) { return p; }
呼叫: point *ptw = new ( arena) pont; // 其中arena 是指向記憶體的一個區塊。
è point *ptw=(point*) arena; if(ptw != 0) ptw->point::point();
arena所表現的真正指標型別,必須指向相同型別的類,要不就是一塊新鮮記憶體,足夠容納下該型別的物件.
派生很顯然不在支援之內.
新鮮記憶體這樣而來: char *arena = new char [ sizeof ( point ) ];
相同型別的物件可以這樣獲得: point *arena = new point;
無論如何 新的pont的空間的確是覆蓋了arena的位置. 一般而言預先定義好的過載new不支援多型.
5臨時物件
C++標準容許對於臨時物件的產生有完全的自由度
臨時物件的被摧毀,應該是對完整求值過程中最後一個步驟.該完整表示式造成臨時物件的產生.
String v= s+a+b+c; 臨時物件有: temp1=s+a; temp2=temp1+b; te=temp2+c; 在臨時物件3時 臨時物件1 雖然已經沒有什麼用了,但是要等到整個表示式完成後才可以釋放記憶體.
凡是含有表示式結果的臨時物件,應該保留到物件的初始化操作完成為止.
上面的表示式產生了3個臨時物件,在整個表示式結束後,temp1,temp2 將被釋放,temp3 要等到 v=temp3 後方可釋放.
如果一個臨時物件被繫結於個引用後,物件將保留,直到被初始化引用的生命結束,或直到臨時物件的生命範疇結束-----要看哪種情況先來而定
const string &space = a+b; 這裡的臨時物件將和space結束而結束,或者超過了生命範圍之內.
Const string &s= foo(); // point foo() { return point;}這裡的臨時物件超過了生命範圍之內.s將是錯誤的
這個條沒有對指標繫結臨時物件作出明確的解釋
const char * a=b+c+d;
曾牧暗鯊 && 大白鯊 -8-18
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982202/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++物件模型之七 模板 異常 RTTI筆記 (轉)C++物件模型筆記
- C++物件模型之五 構造 析構 賦值筆記 (轉)C++物件模型賦值筆記
- C++程式設計思想筆記之六 (轉)C++程式設計筆記
- 《深度探索C++物件模型》讀書筆記C++物件模型筆記
- 深度解讀《深度探索C++物件模型》之C++物件的記憶體佈局C++物件模型記憶體
- Effective Object C 2.0 『物件、訊息、執行期』Object物件
- java併發筆記之java執行緒模型Java筆記執行緒模型
- 《Mastering Delphi 6》學習筆記之六 (轉)AST筆記
- C++ 物件模型C++物件模型
- C++物件模型C++物件模型
- C++程式設計思想筆記之四 (轉)C++程式設計筆記
- 吳恩達大模型教程筆記-六-吳恩達大模型筆記
- C++物件模型:objectC++物件模型Object
- C++編譯期多型與執行期多型C++編譯多型
- Effective C++ 第六章--繼承與物件導向設計筆記C++繼承物件筆記
- 【JVM】JVM系列之記憶體模型(六)JVM記憶體模型
- c#之word物件模型小記C#物件模型
- 圖說C++物件模型:物件記憶體佈局詳解C++物件模型記憶體
- C++物件模型之二 構造語句 (轉)C++物件模型
- JAVA之編譯期和執行期區別Java編譯
- celery筆記六之worker介紹筆記
- Go 筆記之物件導向Go筆記物件
- c++中的物件模型C++物件模型
- C++物件模型詳解C++物件模型
- C++物件模型:constructorC++物件模型Struct
- Effective c++(筆記)之繼承關係與物件導向設計C++筆記繼承物件
- 學習筆記——瀏覽器物件模型(Window)筆記瀏覽器物件模型
- C++ 學習筆記之 引用C++筆記
- Linux C++ 自學筆記 (轉)LinuxC++筆記
- Linux C++ 自學筆記(轉)LinuxC++筆記
- 手工生成AWR執行期對比報告記錄
- 《深度探索c++記憶體模型》讀書筆記 (二)C++記憶體模型筆記
- es筆記六之聚合操作之指標聚合筆記指標
- 人月神話讀書筆記(六) (轉)筆記
- 《C++ Primer》學習筆記(六):C++模組設計——函式C++筆記函式
- C++物件模型:編譯分析C++物件模型編譯
- Activiti 學習筆記六:流程執行歷史記錄筆記
- 侯捷C++物件導向高階開發筆記C++物件筆記