Kio estas la avantaĝo uzi Java Staplo Variables?

Stack Variables

Stakigi Variables
En ĉi tiu artikolo ni parolos pri la malsamaj vojoj deklari variables en Java kaj la avantaĝo kaj malavantaĝo uzi lokan variables aŭ Staplo variables. En java, Estas diferencoj inter staplo varia kaj aliaj tipoj de variables kiel loka kaj klaso. Ĉi tiu artikolo priskribos la detalojn kun ekzemplo kaj helpi vin efektivigi ĝin ĝuste.

Enkonduko:
La JVM disigas la memoron en sekvanta sekciojn:

  • Amaso: Ĉi tiu sekcio enhavas objektojn kaj ankaŭ la referenco variables.
  • Staplo: Ĉi tiu sekcio enhavas metodojn, Loka variables kaj referenco variables.
  • Kodo: Ĉi tiu sekcio enhavas la byte kodo.
  • Senmova: Ĉi tiu sekcio enhavas la senmovan variables kaj metodoj.

En Java, Ni povas deklari variables en la sekvanta tri manieroj:

  • Okazo variables.
  • Klasa nivelo aŭ Senmova variables.
  • Loka aŭ Staplo variables.

Okazo variables: Okazo variables indikas ke ili ekzistas por okazo de la klaso. Se klaso havas dek okazojn, Ni havos dek kopiojn de ĉiu okazo variables. Okazo variables estas ankaŭ nomita kiel ne senmova variables.

Klasa nivelo aŭ Senmova Variables: Klasa nivelo aŭ Senmova variables ekzistas por klaso neniu afero kiom da okazo de la klaso ni kreas. Ĉi tiuj estas deklarita uzanta la senmovan ŝlosilvorton. Senmova variables estas initialized kiam la klaso estas unue ŝarĝita en la JVM.

Loka aŭ Staplo Variables: Loka aŭ staplo variables estas difinita ene de metodo kaj estas loka en amplekso. Ilia amplekso varias dependanta al la alira modifilo uzita deklari ilin.

Java memory distribution

Java memora disdonado

Pic1: Java memora disdonado

Lasi nin vidi la sekvantan tri java kodoj

Enlistiganta 1: Aliri al staplo varia:

[Kodo]

Prezenti com.Hejme.Variables;

Publika klaso StackVariables {

// Aliri Stakigi variables

Publika malplena stackAccess(Int maxVal) {

Int j = 0;

Por (Int i = 0; I < Val; I ) {

J = 1;

}

}

}

[/Kodo]

Enlistiganta 2: Aliri al okazo varia

[Kodo]

Prezenti com.Hejme.Variables;

Publika klaso InstanceVariables {

Privata int instVar;

//Aliri Klasifiki okazon varia

Publika malplena instanceAccess(Int val) {

Por (Int i = 0; I < Val; I ) {

InstVar = 1;

}

}

}

[/Kodo]

Enlistiganta 3: Aliri al senmova varia

[Kodo]

Prezenti com.Hejme.Variables;

Publika klaso StaticVariables {

Privata senmova int staticVar;

//Klasifiki senmovan varian aliron

Publika malplena staticAccess(Int val) {

Por (Int i = 0; I < Val; I ) {

StaticVar = 1;

}

}

}

[/Kodo]

Ĉiu de la supra java klasoj efektivigas maŝon por egala nombro de iterations. La nura loko kie ili malsamas estas la tipo de varia kiu akiras incremented ene de la por maŝo. En listero 1, Loka staplo varia estas uzita kaj incremented de 1 Ĉiu tempo la maŝo efektivigas. Enlistiganta 2 Montras ekzemplon uzi kaj incrementing klasa nivelo aŭ okazo ebenigas varian. Enlistiganta 3 Estas ekzemplo uzi incrementing senmova varia.

Okaza nivelo variables kaj senmova variables prenas preskaŭ saman kvanton de tempo efektivigi. Dum loka aŭ staplo variables estas du al tri fojoj pli rapida. En kazo de loka aŭ staplo variables, Pro tio ke la JVM devas elfari malpli taskon ol kiam aliranta senmovan aŭ klasa nivelo aŭ okaza nivelo variables. La sekvantaro produktis byte kodo faras ĝin klara:

Enlistiganta 4: Byte kodas produktita kontraŭ Listero 1 (Stapla Aliro)

[Kodo]

Metodo malplena stackAccess(Int)

0 Iconst_0 //Puŝo 0 Al la staplo.

1 Istore_2 //Popmuziko 0 Kaj enteni ĝin ĉe indekso 2 De la loka varia tablo(J).

2 Iconst_0 //Puŝo 0.

3 Istore_3 //Popmuziko 0 Kaj enteni ĝin ĉe indekso 3 De la loka varia tablo(I).

4 Goto 13 //Salti al loko 13.

7 Iinc 2 1 //Pliigo j entenita ĉe indekso 2 De 1.

10 Iinc 3 1 //Pliigo i entenita ĉe indekso 3 De 1.

13 Iload_3 //Puŝo la valoro ĉe indekso 3(I).

14 Iload_1 //Puŝo la valoro ĉe indekso 1(Val).

15 Se_icmplt 7 //Krevi i kaj val. Salti al loko 7 Se i estas malpli ol val.

18 Revena //Reveno al vokanta metodon.

[/Kodo]

Enlistiganta 5: Byte kodas produktita kontraŭ Listero 2 (okazo aŭ Klasa nivelo Aliro)

[Kodo]

Metodo malplena instanceAccess(Int)

0 Iconst_0 //Puŝo 0 Al la staplo.

1 Istore_2 //Popmuziko 0 Kaj enteni ĝin ĉe indekso 2 De la loka varia tablo(I).

2 Goto 18 //Salti al loko 18.

5 Aload_0 //Puŝa indekso 0(Tio ĉi).

6 Dup //Duplikatas la pintan staplan valoron kaj puŝi ĝin.

7 Getfield #19 <Kampo int instVar>

//Krevi la objektan referencon por tio ĉi kaj puŝi la valoron por instVar.

10 Iconst_1 //Puŝo 1.

11 Iadd //Krevas la supron du valoroj, Puŝi ilian sumon.

12 Putfield #19 <Kampo int instVar>

//Krevi la supron du valoroj kaj enteni la sumon en instVar.

15 Iinc 2 1 //Pliigo i entenita ĉe indekso 2 De 1.

18 Iload_2 //Puŝo la valoro ĉe indekso 2(I).

19 Iload_1 //Puŝo la valoro ĉe indekso 1(Val).

20 Se_icmplt 5 //Krevi i kaj val. Salti al loko 5 Se i estas malpli ol val.

23 Revena //Reveno al vokanta metodon.

[/Kodo]

Enlistiganta 6: Byte kodas produktita kontraŭ Listero 6 (Senmova Aliro)

[Kodo]

Metodo malplena staticAccess(Int)

0 Iconst_0 //Puŝo 0 Al la staplo.

1 Istore_2 //Popmuziko 0 Kaj enteni ĝin ĉe indekso 2 De la loka varia tablo(I).

2 Goto 16 //Salti al loko 16.

5 Getstatic #25 <Kampo int staticVar>

//Puŝi la valoron de la konstanta naĝejo por staticVar.

8 Iconst_1 //Puŝo 1.

9 Iadd //Krevas la supron du valoroj, Puŝi ilian sumon.

10 Putstatic #25 <Kampo int staticVar>

//Krevi la valoron por sumo kaj enteni ĝin en staticVar.

13 Iinc 2 1 //Pliigo i entenita ĉe indekso 2 De 1.

16 Iload_2 //Puŝo la valoro ĉe indekso 2(I).

17 Iload_1 //Puŝo la valoro ĉe indekso 1(Val).

18 Se_icmplt 5 //Krevi i kaj val. Salti al loko 5 Se i estas malpli ol val.

21 Revena //Reveno al vokanta metodon.

[/Kodo]

La sur produktita byte kodo por la tri alproksimiĝoj donas klaran bildon ke uzanta Staplan nivelon variables aŭ loka variables estas efika vojo uzi variables en Java. JVM estas staplo bazita kaj estas sekve pli optimumigita uzi staplan nivelon datumo. La loka variables estas entenita en loka varia tablo sur la Java operand staplo kaj estas alirebla tre facile kaj efike. Ĝi fariĝas multekosta afero uzi kaj manipuli senmovan aŭ okazo ebenigas varian kiel la JVM devas uzi altekostan opcode por aliri ĉi tiuj variables de la konstanta naĝejo.

La kodo donita en listero 2 Kaj listero 3 Povas esti restrukturita en la sekvanta vojo elfari la taskon en efika vojo.

Enlistiganta 7: Restrukturita vojon aliri okazon varia

[Kodo]

Prezenti com.Hejme.Variables;

Publika klaso InstanceVariables {

Privata int instVar;

//Aliri Klasifiki okazon varia

Publika malplena instanceAccess(Int val) {

Int j = instVar;

Por (Int i = 0; I < Val; I ) {

J = 1;

}

InstVar = j;

}

}

[/Kodo]

Enlistiganta 8: Restrukturita vojon aliri senmovan varia

[Kodo]

Prezenti com.Hejme.Variables;

Publika klaso InstanceVariables {

Privata int staticVar;

//Aliri Klasifiki okazon varia

Publika malplena instanceAccess(Int val) {

Int j = staticVar;

Por (Int i = 0; I < Val; I ) {

J = 1;

}

StaticVar = j;

}

}

[/Kodo]

Kiel ni vidas la metodojn instanceAccess kaj staticAccess estas modifita kopii ilian okazon aŭ senmova variables en loka staplo varia. la operacio aŭ la manipulado estas elfarita sur la kopiita lokan staplon varia kaj kiam la manipulado de varia finas, La valoro estas kopiita reen al la okazo aŭ senmova varia. Ĉi tiu simpla ŝanĝo grave plibonigas la elfaron de instanceAccess kaj staticAccess. Kun ĉi tiu ŝanĝo la ekzekuta tempo de ĉiuj ĉi tiuj tri metodoj estas nun efike samaj.

Ĉi tiu alproksimiĝo faras ne rekomendas la fakton ke ni devus eviti uzanta senmovan aŭ okazo variables. Prefere ni devus uzi ajnan mekanisman faran senton kaj estas pli efika por nia desegno. Ekz. En la supra ekzemplo, Se ni devas aliri aliron senmova aŭ okazo varia en maŝo, Ni grave povas plibonigi la elfaron de la kodo de intertempe entenanta ilin en loka staplo varia. Tio ĉi provizas pli efika sinsekvo de byte kodaj instruoj por la JVM efektivigi.

Resuma: Konkludi la diskuton, Ni resumis la punktojn sub. Ni devas kompreni la koncepton de java variables kaj ilia amplekso. Kaj la plej grava parto estas la efektivigo de ĉi tiuj variables en ĝusta loko. Hope ĉi tiu artikolo helpos vin kompreni la detalojn kaj uzi ĝin en via apliko.

  • JVM disigas la memoron en sekvanta sekciojn :Amaso, Staplo, Kodo kaj Senmova
  • Java permesas nin deklari variables en la sekvanta tri vojoj:
    • Okazo
    • Senmova
    • Loka aŭ staplo.
  • Uzanta Staplan nivelon variables akcelas la ekzekuton de programo de du al tri fojoj.
  • Se devi uzi senmovan aŭ okazo ebenigas varian, Ni devus kopii ĝin al loka varia antaŭ ol manipulanta la datumon aŭ faranta iun operacion.

?

?

?

?

?

Etikedita sur: ,
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share