ประโยชน์ของการใช้ตัวแปร Java Stack คืออะไร?

Stack Variables

ตัวแปรสแต็ค
ในบทความนี้เราจะพูดคุยเกี่ยวกับวิธีการที่แตกต่างกันในการประกาศตัวแปรใน Java และความได้เปรียบและข้อเสียของการใช้ตัวแปรท้องถิ่นหรือตัวแปรกอง. ใน Java, มีความแตกต่างระหว่างตัวแปรสแต็คและประเภทอื่น ๆ ของตัวแปรเช่นในท้องถิ่นและระดับ. บทความนี้จะอธิบายรายละเอียดด้วยตัวอย่างและช่วยให้คุณใช้มันอย่างถูกต้อง.

การแนะนำ:
JVM ที่แบ่งหน่วยความส่วนต่อไปนี้:

  • กอง: ส่วนนี้ประกอบด้วยวัตถุและตัวแปรอ้างอิง.
  • กอง: ในส่วนนี้จะมีวิธีการ, ตัวแปรและตัวแปรอ้างอิงในท้องถิ่น.
  • Code: ส่วนนี้ประกอบด้วยรหัสไบต์.
  • Static: ในส่วนนี้จะมีตัวแปรคงที่และวิธีการ.

ใน Java, เราสามารถประกาศตัวแปรในต่อไปนี้สามมารยาท:

  • ตัวแปรเช่น.
  • ระดับชั้นเรียนหรือตัวแปรคงที่.
  • ตัวแปรท้องถิ่นหรือสแต็ค.

ตัวแปรเช่น: ตัวแปรเช่นแสดงให้เห็นว่าพวกเขามีอยู่ต่อตัวอย่างของชั้นเรียน. ถ้าชั้นมีสิบกรณี, เราจะมีสิบสำเนาของแต่ละตัวแปรเช่น. ตัวแปรเช่นจะเรียกว่ายังเป็นตัวแปรคงไม่ใช่.

ระดับชั้นเรียนหรือตัวแปรคงที่: ระดับชั้นเรียนหรือตัวแปรคงอยู่ต่อชั้นเรียนไม่ว่ากี่ตัวอย่างของการเรียนที่เราสร้าง. เหล่านี้มีการประกาศใช้คำสำคัญแบบคงที่. ตัวแปรคงที่จะเริ่มต้นเมื่อเรียนที่มีการโหลดครั้งแรกใน JVM.

ตัวแปรท้องถิ่นหรือสแต็ค: ตัวแปรท้องถิ่นหรือสแต็คได้กำหนดไว้ในวิธีการและท้องถิ่นในขอบเขต. ขอบเขตของพวกเขาแตกต่างกันไปขึ้นอยู่กับการปรับปรุงการเข้าถึงที่ใช้ในการประกาศให้.

Java memory distribution

การจัดจำหน่ายหน่วยความจำ Java

pic1: การจัดจำหน่ายหน่วยความจำ Java

ให้เราดูต่อไปนี้สามรหัสชวา

Listing 1: การเข้าถึงตัวแปรสแต็ค:

[Code]

com.home.variables แพคเกจ;

StackVariables เรียนสาธารณะ {

// การเข้าถึงไปยังกองตัวแปร

stackAccess โมฆะสาธารณะ(int mAXVAL) {

int J = 0;

สำหรับ (int i = 0; ผม < Val; i ) {

J = 1;

}

}

}

[/Code]

Listing 2: การเข้าถึงตัวแปรเช่น

[Code]

com.home.variables แพคเกจ;

InstanceVariables เรียนสาธารณะ {

instVar int ส่วนตัว;

//การเข้าถึงตัวแปรเช่นชั้น

instanceAccess โมฆะสาธารณะ(int Val) {

สำหรับ (int i = 0; ผม < Val; i ) {

instVar = 1;

}

}

}

[/Code]

Listing 3: การเข้าถึงตัวแปรคง

[Code]

com.home.variables แพคเกจ;

StaticVariables เรียนสาธารณะ {

ส่วนตัว staticVar int คงที่;

//ระดับการเข้าถึงตัวแปรคงที่

staticAccess โมฆะสาธารณะ(int Val) {

สำหรับ (int i = 0; ผม < Val; i ) {

staticVar = 1;

}

}

}

[/Code]

แต่ละชั้นเรียน Java ข้างต้นรันห่วงสำหรับจำนวนที่เท่ากันของการทำซ้ำ. สถานที่เดียวที่พวกเขาแตกต่างคือประเภทของตัวแปรที่ได้รับเพิ่มขึ้นภายในห่วง. ในรายชื่อ 1, ตัวแปรสแต็คในท้องถิ่นและถูกนำมาใช้เพิ่มขึ้นโดย 1 ทุกครั้งที่วงรัน. Listing 2 แสดงให้เห็นตัวอย่างของการใช้และการเพิ่มระดับชั้นเรียนหรือตัวแปรระดับอินสแตนซ์. Listing 3 เป็นตัวอย่างของการใช้เป็นนักการเพิ่มตัวแปรคง.

ตัวแปรระดับอินสแตนซ์และตัวแปรคงใช้เงินจำนวนเดียวกันเกือบของเวลาที่จะดำเนินการ. ในขณะที่ตัวแปรท้องถิ่นหรือสแต็คเป็น 2-3 ครั้งได้เร็วขึ้น. ในกรณีของตัวแปรท้องถิ่นหรือสแต็ค, ตั้งแต่ JVM มีการดำเนินการน้อยกว่าเมื่อมีการเข้าถึงแบบคงที่หรือระดับชั้นเรียนหรือตัวแปรระดับอินสแตนซ์. รหัสต่อไปนี้ไบต์สร้างทำให้มันชัดเจน:

Listing 4: รหัสไบต์สร้างขึ้นกับรายชื่อ 1 (การเข้าถึงสแต็ค)

[Code]

วิธีโมฆะ stackAccess(int)

0 iconst_0 // กด 0 บนสแต็ค.

1 istore_2 // ป๊อป 0 และเก็บไว้ที่ดัชนี 2 ของตารางตัวแปรท้องถิ่น(j).

2 iconst_0 // กด 0.

3 istore_3 // ป๊อป 0 และเก็บไว้ที่ดัชนี 3 ของตารางตัวแปรท้องถิ่น(ผม).

4 ไปที่ 13 //ข้ามไปยังตำแหน่ง 13.

7 iinc 2 1 //เพิ่ม J บันทึกอยู่ในดัชนี 2 by 1.

10 iinc 3 1 //เพิ่มขึ้นผมเก็บไว้ที่ดัชนี 3 by 1.

13 iload_3 // ผลักดันมูลค่าดัชนี 3(ผม).

14 iload_1 // ผลักดันมูลค่าดัชนี 1(Val).

15 if_icmplt 7 //Pop ฉันและวาล. ข้ามไปยังตำแหน่ง 7 ถ้าฉันมีค่าน้อยกว่า Val.

18 ผลตอบแทน // กลับไปใช้วิธีการโทร.

[/Code]

Listing 5: รหัสไบต์สร้างขึ้นกับรายชื่อ 2 (อินสแตนซ์หรือระดับชั้นการเข้าถึง)

[Code]

วิธีโมฆะ instanceAccess(int)

0 iconst_0 // กด 0 บนสแต็ค.

1 istore_2 // ป๊อป 0 และเก็บไว้ที่ดัชนี 2 ของตารางตัวแปรท้องถิ่น(ผม).

2 ไปที่ 18 //ข้ามไปยังตำแหน่ง 18.

5 aload_0 // ผลักดันดัชนี 0(นี้).

6 dup // ซ้ำค่าสแต็คชั้นนำและผลักดันมัน.

7 getfield #19 <สนาม instVar int>

//ป๊อปอ้างอิงวัตถุนี้และผลักดันค่าสำหรับ instVar.

10 iconst_1 // กด 1.

11 iadd // Pop ด้านบนสองค่า, ผลักดันผลรวมของพวกเขา.

12 putfield #19 <สนาม instVar int>

//Pop ด้านบนสองค่าและเก็บผลรวมใน instVar.

15 iinc 2 1 //เพิ่มขึ้นผมเก็บไว้ที่ดัชนี 2 by 1.

18 iload_2 // ผลักดันมูลค่าดัชนี 2(ผม).

19 iload_1 // ผลักดันมูลค่าดัชนี 1(Val).

20 if_icmplt 5 //Pop ฉันและวาล. ข้ามไปยังตำแหน่ง 5 ถ้าฉันมีค่าน้อยกว่า Val.

23 ผลตอบแทน // กลับไปใช้วิธีการโทร.

[/Code]

Listing 6: รหัสไบต์สร้างขึ้นกับรายชื่อ 6 (การเข้าถึงแบบคงที่)

[Code]

วิธีโมฆะ staticAccess(int)

0 iconst_0 // กด 0 บนสแต็ค.

1 istore_2 // ป๊อป 0 และเก็บไว้ที่ดัชนี 2 ของตารางตัวแปรท้องถิ่น(ผม).

2 ไปที่ 16 //ข้ามไปยังตำแหน่ง 16.

5 getstatic #25 <สนาม staticVar int>

//ผลักดันค่าจากสระว่ายน้ำคงที่สำหรับ staticVar.

8 iconst_1 // กด 1.

9 iadd // Pop ด้านบนสองค่า, ผลักดันผลรวมของพวกเขา.

10 putstatic #25 <สนาม staticVar int>

//ป๊อปอัพค่าสำหรับผลรวมและเก็บไว้ใน staticVar.

13 iinc 2 1 //เพิ่มขึ้นผมเก็บไว้ที่ดัชนี 2 by 1.

16 iload_2 // ผลักดันมูลค่าดัชนี 2(ผม).

17 iload_1 // ผลักดันมูลค่าดัชนี 1(Val).

18 if_icmplt 5 //Pop ฉันและวาล. ข้ามไปยังตำแหน่ง 5 ถ้าฉันมีค่าน้อยกว่า Val.

21 ผลตอบแทน // กลับไปใช้วิธีการโทร.

[/Code]

รหัสไบต์สร้างขึ้นดังกล่าวข้างต้นทั้งสามแนวทางให้ภาพที่ชัดเจนว่าการใช้ตัวแปรระดับกองหรือตัวแปรท้องถิ่นเป็นวิธีที่มีประสิทธิภาพในการใช้ตัวแปรใน Java. JVM เป็นสแต็คและอื่น ๆ อีกมากมายจึงเพิ่มประสิทธิภาพในการใช้ข้อมูลระดับสแต็ค. ตัวแปรท้องถิ่นจะถูกเก็บไว้ในตารางตัวแปรท้องถิ่นในตัวถูกดำเนินการสแต็คชวาและสามารถเข้าถึงได้อย่างง่ายดายและมีประสิทธิภาพ. มันจะกลายเป็นเรื่องค่าใช้จ่ายในการใช้และจัดการกับแบบคงที่หรือตัวแปรระดับเช่นเป็น JVM มีการใช้ opcode ราคาแพงเพื่อให้สามารถเข้าถึงตัวแปรเหล่านี้จากสระว่ายน้ำอย่างต่อเนื่อง.

รหัสที่กำหนดในรายชื่อ 2 และรายชื่อ 3 สามารถปรับโครงสร้างหนี้ด้วยวิธีต่อไปนี้จะทำงานได้อย่างมีประสิทธิภาพ.

Listing 7: วิธีการปรับโครงสร้างหนี้ในการเข้าถึงตัวแปรเช่น

[Code]

com.home.variables แพคเกจ;

InstanceVariables เรียนสาธารณะ {

instVar int ส่วนตัว;

//การเข้าถึงตัวแปรเช่นชั้น

instanceAccess โมฆะสาธารณะ(int Val) {

int J = instVar;

สำหรับ (int i = 0; ผม < Val; i ) {

J = 1;

}

instVar = J;

}

}

[/Code]

Listing 8: การปรับโครงสร้างหนี้วิธีการเข้าถึงตัวแปรคง

[Code]

com.home.variables แพคเกจ;

InstanceVariables เรียนสาธารณะ {

staticVar int ส่วนตัว;

//การเข้าถึงตัวแปรเช่นชั้น

instanceAccess โมฆะสาธารณะ(int Val) {

int J = staticVar;

สำหรับ (int i = 0; ผม < Val; i ) {

J = 1;

}

staticVar = J;

}

}

[/Code]

ที่เราเห็นวิธีการ instanceAccess และ staticAccess มีการแก้ไขเช่นการคัดลอกหรือตัวแปรคงที่ของพวกเขาเป็นตัวแปรสแต็คในท้องถิ่น. การดำเนินการหรือการจัดการที่มีการดำเนินการเกี่ยวกับตัวแปรสแต็คัดลอกท้องถิ่นและเมื่อการจัดการของตัวแปรที่มีมากกว่า, ค่าที่ถูกคัดลอกกลับไปอินสแตนซ์หรือตัวแปรคงที่. นี้มีการเปลี่ยนแปลงอย่างมีนัยสำคัญที่เรียบง่ายช่วยเพิ่มประสิทธิภาพของ instanceAccess และ staticAccess. ด้วยเหตุนี้การเปลี่ยนเวลาการดำเนินการของทั้งหมดในขณะนี้ทั้งสามวิธีจะเหมือนกันได้อย่างมีประสิทธิภาพ.

วิธีนี้ไม่ได้สนับสนุนความจริงที่ว่าเราควรหลีกเลี่ยงการใช้ตัวแปรคงที่หรืออินสแตนซ์. แต่เราควรจะใช้สิ่งที่ทำให้รู้สึกกลไกและมีประสิทธิภาพมากขึ้นสำหรับการออกแบบของเรา. e.g. ในตัวอย่างข้างต้น, ถ้าเราจำเป็นต้องเข้าถึงการเข้าถึงแบบคงที่หรือตัวแปรเช่นในวง, เราอย่างมีนัยสำคัญสามารถปรับปรุงประสิทธิภาพของรหัสโดยชั่วคราวเก็บไว้ในตัวแปรสแต็คในท้องถิ่น. นี้จะให้มีประสิทธิภาพมากขึ้นตามลำดับของคำสั่งรหัสไบต์สำหรับ JVM ในการดำเนินการ.

Summary: เพื่อสรุปการอภิปราย, เราได้สรุปประเด็นดังต่อไปนี้. เราจำเป็นต้องเข้าใจแนวคิดของตัวแปร Java และขอบเขตของพวกเขา. และส่วนที่สำคัญที่สุดคือการดำเนินงานของตัวแปรเหล่านี้ในสถานที่ที่ถูกต้อง. หวังว่าบทความนี้จะช่วยให้คุณเข้าใจรายละเอียดและใช้มันในการประยุกต์ใช้ของคุณ.

  • JVM แบ่งหน่วยความส่วนต่อไปนี้ :กอง, กอง, รหัสและแบบคงที่
  • Java ช่วยให้เราสามารถประกาศตัวแปรในต่อไปนี้สามวิธี:
    • ตัวอย่าง
    • Static
    • ท้องถิ่นหรือสแต็ค.
  • ใช้ตัวแปรระดับกองเร่งการทำงานของโปรแกรมโดย 2-3 ครั้ง.
  • หากต้องใช้แบบคงที่หรือตัวแปรระดับอินสแตนซ์, เราควรจะคัดลอกไปยังตัวแปรท้องถิ่นก่อนที่จะจัดการกับข้อมูลหรือการทำการดำเนินการบางอย่าง.

 

 

 

 

 

============================================= ============================================== ซื้อหนังสือ techalpine ที่ดีที่สุดใน Amazon,en,ช่างไฟฟ้า CT Chestnutelectric,en
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share