【深さ探索C++対象モデル読書ノート】【第6章】実行期語意学

1850 ワード

一、オブジェクトの構造と構造
1、1つのセグメントまたは関数に1つ以上の離脱点がある場合、destructorは各離脱点の前に置かなければならない.
2、一般的にobjectはできるだけそのプログラム領域の近くに置くべきで、このようにして不要なオブジェクトの発生と破壊操作を節約することができます.
3、C++プログラム内のglobal objectsはすべてプログラムのdata segmentに配置されます.global objectにconstructorとdestructorがある場合は、静的な初期化とメモリ解放操作が必要です.初期値を明示的に指定しない場合、objectで構成されるメモリの内容は0になります.
4、virtual base class subobjectに1つのderived classのpointerまたはreferenceでアクセスします.nonconstant expressionであり、実行期間中に評価を評価する必要があります.virtualbase classのsubobjectは、各derivedclassにおける位置が変動する可能性があり、コンパイル時期に決定できません.
5、新しいC++規格では、コンパイル単位のstatic class objectsは、対応する関数が最初に呼び出されたときに構築され、構造の逆の順序で破棄される必要があります.これらのobjectsは必要に応じて構築されるため,コンパイル時にその集合と順序を予想することはできない.新しい基準をサポートするために、生成されたstatic local class objectsに対して実行期間チェーンテーブルを保持する場合があります.
二、newおよびdelete演算子
1、演算子newの使用は2つのステップで完了する.
a)適切なnew演算子関数の例により、必要なメモリを構成する
b)構成されたオブジェクトに初期値を設定する
int *pi = new int(5);
//new          
int *pi;
if (pi = __new(sizeof(int)))
	*pi = 5;

2、演算子deleteの使用は2つのステップで完了します.
a)オブジェクトの解析関数によりオブジェクトを解析する
b)構成されたメモリを解放する
if (pi != 0)
	__delete(pi);

3、NewA[x]はdelete[]が現れる場合にのみコンパイラが配列の次元を探すためdelete[]pを使用する必要があります.そうしないと、単独のobjectだけが削除されると仮定します.
4、ベースクラスポインタがサブクラスオブジェクトからなる配列を指す場合、一般的にsizeof(サブクラスオブジェクト)>sizeof(ベースクラスオブジェクト)と言いますが、配列解析の場合、ベースクラス解析関数のみが呼び出され、サブクラス解析関数は呼び出されませんので、サブクラスに特別なリソースがある場合は、必ず解放できません.1つのbase classポインタがderived class objectsからなる配列を指すことを避けたほうがいい.derived class objectがbaseより大きい場合.
三、一時的な対象
1、一時的なオブジェクトの破壊は、完全な式を評価する最後のステップであるべきである.この完全な式は、一時的なオブジェクトの生成をもたらします.一時オブジェクトのライフルールには2つの例外があります.1)最初の例外は、式がobjectを初期化するために使用される場合に発生します.式の実行結果を持つ一時オブジェクトは、objectの初期化操作が完了するまで保存する必要があります.2)第2の例外は、一時オブジェクトがreferenceにバインドされている場合、一時オブジェクトがreferenceにバインドされている場合、初期化されたreferenceのライフが終了するまで、または一時オブジェクトのライフカテゴリが終了するまで、オブジェクトが残ります.