スタックとヒープ:
スタック
スタックは、単に各プログラムが始まるメモリの特定の範囲です。すべてのプログラムにはスタックがあり、そのプログラミングが実行されているとき、CPUは実際にスタックの「トップ」があるところへのポインタを格納します。 関数が呼び出されると、コード(コンパイラによって生成される)は、このスタックポインタ(SP)によって参照されるメモリ内のポイントに値(パラメータのコピー、および関数を呼び出したコードの戻りアドレス) 。次に、SPを修正して、パラメータの後のポイントまでさらにビットをポイントします。
戻り値は、SPが指すメモリ内のポイントに戻り値を書き込んだ後、関数を呼び出したコードにコードの実行を戻します。その後、そのコードはSPの場所から戻り値をコピーし、SPをデクリメントします。
この領域はスタックと呼ばれます。これは、1.ローカル変数を宣言したとき、または2.パラメータを使用して関数を呼び出すときに、値をコピーするためです。
そして、関数から返ってくるときには、パラメータとローカル変数がオフになります。
(実際にはコンパイラは実際には値をCPUレジスタにコピーし、戻り値もCPUレジスタにコピーするように指示します)。
ヒープ
ヒープは、単に通常(Cでのmallocによって呼び出される)システムコール(LinuxでBRK)によって、プログラムによって割り当てられ、他のすべてのメモリを指します。プログラムには、オペレーティングシステムに割り当てようとしているメモリのチャンクがたくさんある可能性があります。これらのメモリチャンク(全体として)は、ヒープと呼ばれます。 Javaで
:あなたは「新しい」キーワードを使用する場合
ポインタ変数を使用して、新しいExampleObject()で作成するオブジェクトを割り当てると、実際には両方が実行されます。この場合、ポインタ(参照)変数はスタックポインタの位置に作成されます。次に、スタックポインタが移動され(ポインタ値のサイズである8バイトで追加されます)、new()関数はヒープ領域から新しいメモリ参照を取得し、その参照の値がローカルにコピーされますポインタ変数。
実際には、プログラムを実行しているときにJavaのような言語は、特定のサイズのスタックと、オペレーティングシステムによってすでに割り当てられている特定のサイズのメモリ(ヒープと呼ばれます)から始まり、スペースが不足しています
CPUがどのように機能しているか、特にそれらが値を格納するレジスタをどのように持っているか、そのうちの1つがスタックポインタです。どのように加算と減算を行うか。これは重要です。なぜなら、たとえば追加時に、参照されたアドレスから別の参照先の番号に数値を追加するなどしないためです。アセンブリ命令(Javaバイトコードに似ています)を見ると、より頻繁に何が行われるのでしょうか?
たとえば、次のような関数があります:addnum(int a、int b){return a + b;} a。 SPが指しているSP ieから番号1をレジスタ1にロードします。
b。 SPが指している直前の番号(SP-1)をレジスタ2にロードします。
c。呼び出しAdd CPU命令。結果はレジスタR3に格納されます。 d。 SPにR3の値をコピー+ 1
このような
電話番号のように見えるかもしれません
:(ノートでは、これらは、例えば、CPU命令を作っている - 彼らは、各CPUに対して異なっており、Javaがあり、独自のバイトコードを持っています類似している。私はその後)
int x;
x = addnum(9,6);
INCSP +1 #allocate x at location SP and increment SP by 1
# start function call
# make 3 spaces, for a, b, and b and return value
INCSP +3 #add 3 to SP register
STORESP 9,0 # copy 9 value to SP-0
STORESP 6,-1 # copy 6 value to SP-1
JUMP addnum # jump to executing the function code
をスタックポインタから例えばSTORESP =>積層する書き込み、LOADSP =>負荷を使用している、機能自体は
LOADSP,0,R1 #copy from SP-0 (a) into reg 1
LOADSP,-1,R2 #copy from SP-1(b) into reg 2
ADDREG,R1,R2,R3 # add reg1 reg2 and store in R3
STORESP,R3,-2 #save the result to SP-2
RETURN
そして再び関数を呼び出します。x(コピーSP-2)で 店舗結果(SP-3)
LOADSP,-2,R1
STORESP,R1,-3
は今、関数呼び出しが行われます。だから、
ADDSP -3
そして今結果(3のSPをデクリメントすることにより)aとbのスタックおよび戻り値 に割り当てられたスペースを捨て、これはもちろん「x」の
でありますはるかに単純化されていて正確ではありませんが、理解を深めるための例のためだけです。
しかし、これらの低レベルのものがどのように機能するかを見れば、2つの数値を追加するような基本的なことを行うだけで、関数のどこで「どのように」パラメータが渡されるのか、重要なスタックコンセプトは
幸運
「インターネット上の議論」からのリンクやエキサイトを提供できますか? – CKing
Javaには実際には左辺値と右辺値の概念はありません。言語仕様におけるそれらの唯一の言及は、[ここ](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html)です。ここでは、「変数(§4.12 )(Cでは、これは左辺値と呼ばれます)。右辺値は基本的に単なる変数ではなく、値を代入することはできません(代入の「右辺」)。 –
[Wikipedia](https://en.wikipedia.org/wiki/Value_(computer_science)#lrvalue)の記事が参考になるかもしれません。スタックとヒープについては、残念ながら技術的な説明なしに説明することはできません。少なくともそれは変数との関係を説明するものではない。 – RealSkeptic