プロセッサは初期化されていない変数をどのように処理しますか?

2020-03-26 c++ assembly

だから私は基本的にアセンブリで変数がどのように格納されるかを理解しなければならない割り当てがあり、C ++がさまざまな変数を処理する方法を理解することに問題があります。

MyClass var;
MyClass *p = new MyClass();
var.setX(3)

私が考え出したのは: * p参照は、作成されたオブジェクトがヒープに割り当てられている間、スタックに格納されます。 これは、pが作成されたオブジェクトを参照していることを意味します。正しいか確認してください。

問題は、varで何が起こるかです。動的に割り当てられますか? アセンブリを調べていますが、答えを示すようなものは見つかりません。

Answers

pがスタックに格納されていると言うのは誤解を招くものです。 pは自動保存期間があり、コンパイラが保存することを決定した場合、コンパイラが保存することを決定した場所に保存されます。それスタックに格納される場合もあれば、完全にレジスター内に存在し、決してメモリーに格納されることもない場合もあります。

varはまったく同じです。ほとんどの呼び出し規約では、メソッド呼び出しにオブジェクトのアドレスを渡す必要があるため、その上でメソッドを呼び出すため、スタック用のスペースが確保される可能性があります。しかし、多分そうではない。呼び出しの時点でsetXの完全な定義が表示されている場合は、コンパイラが呼び出しをインライン化している可能性があります。それはすべて、プログラムの正確な詳細に依存します。以下は、コンパイラーが正確にそれを行う例です。 varの部分もまったくメモリに書き込まれないことに注意してください。完全にesi格納されesi

同様に、 newによって割り当てられたオブジェクトには、動的な保存期間があります。これはおそらく、システムのヒープから割り当てられたメモリに存在することを意味しますが、これもC ++言語では指定されていません。

Related