私はワイルドな推測をします:
C ++のコンストラクタとデストラクタは、関数ではありません。マクロです。オブジェクトが作成されるスコープと、オブジェクトが破棄されるスコープにインライン化されます。同様に、コンストラクタもデストラクタもありません。オブジェクトはISです。
実際、クラス内の他の関数も関数ではなく、それらのアドレスを取得するためにDONTがインライン化されるインライン関数であると思いますその関数を最適化します)、そして、関数は「まだそこにある」ように見えます。
C ++の「オブジェクト」の仮想テーブルはJavaScriptオブジェクトのようなものではなく、そのコンストラクタを取得し、実行時にオブジェクトを作成することができnew XMLHttpRequest.constructor
ます。 、オブジェクトを作成する機能を除きます。そして、それは構造体を削除しようとするようなものであるため、オブジェクトを「削除」することすら意味がありません。クラスを4つの整数として使用します。
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
メモリリークはありません。問題はありません。ただし、オブジェクトインターフェイスと文字列のために予約されているスタックスペースを事実上無駄にしていますが、プログラムを破壊することはありません(使用しない限り)再び文字列として)。
実際、以前の仮定が正しい場合:文字列の完全なコストは、これらの32バイトと定数文字列スペースを格納するコストです:関数はコンパイル時にのみ使用され、インライン化されて捨てられる可能性がありますオブジェクトが作成され、使用されます(構造体で作業しており、関数呼び出しなしで直接参照している場合と同様に、関数ジャンプの代わりに呼び出しが重複していることを確認しますが、これは通常より速く、スペースを節約します)。本質的に、関数を呼び出すたびに、コンパイラーはその呼び出しを、言語設計者が設定した例外を除き、文字通り実行するための命令に置き換えるだけです。
要約:C ++オブジェクトには、それらが何であるかがわかりません。それらとインターフェースするためのすべてのツールは静的にインライン化され、実行時に失われます。これにより、構造体にデータを入力するのと同じくらい効率的にクラスを操作でき、関数をまったく呼び出さずにそのデータを直接操作できます(これらの関数はインライン化されます)。
これは、コンパイラがこの情報を捨てることができないため、実行時のオーバーヘッド、メモリ管理、構築の呼び出しを犠牲にして、型情報を動的に保持するCOM / ObjectiveCおよびjavascriptのアプローチとはまったく異なります。動的ディスパッチ用。これにより、実行時にプログラムと「対話」し、実行中に反映可能なコンポーネントを使用してプログラムを開発することができます。