คำถามติดแท็ก stack

โครงสร้างข้อมูล LIFO (Last In, First Out)

6
หน่วยความจำ Stack และ Heap ใน Java
ดังที่ฉันเข้าใจใน Java หน่วยความจำสแต็คจะเก็บข้อมูลพื้นฐานและวิธีการเรียกใช้และหน่วยความจำฮีปใช้เพื่อจัดเก็บวัตถุ สมมติว่าฉันมีชั้นเรียน class A { int a ; String b; //getters and setters } ดั้งเดิมaในชั้นเรียนAจะถูกเก็บไว้ที่ไหน เหตุใดหน่วยความจำฮีปจึงมีอยู่ทั้งหมด ทำไมเราไม่เก็บทุกอย่างไว้ในกองซ้อน? เมื่อวัตถุได้รับการรวบรวมขยะสแต็กที่เกี่ยวข้องกับวัตถุที่ถูกทำลายจะถูกจัดเก็บหรือไม่?

7
เหตุใด call stack จึงมีขนาดสูงสุดคงที่
เมื่อทำงานกับภาษาการเขียนโปรแกรมสองสามภาษาฉันสงสัยอยู่เสมอว่าทำไมเธรดสแต็กมีขนาดสูงสุดที่กำหนดไว้ล่วงหน้าแทนที่จะขยายโดยอัตโนมัติตามต้องการ ในการเปรียบเทียบโครงสร้างระดับสูงทั่วไปบางอย่าง (รายการแผนที่ ฯลฯ ) ซึ่งพบในภาษาการเขียนโปรแกรมส่วนใหญ่ได้รับการออกแบบให้เติบโตตามที่ต้องการในขณะที่เพิ่มองค์ประกอบใหม่ถูก จำกัด ขนาดโดยหน่วยความจำที่มีอยู่หรือตามข้อ จำกัด ด้านการคำนวณ เช่นที่อยู่ 32 บิต) ฉันไม่ทราบว่าภาษาการเขียนโปรแกรมหรือสภาพแวดล้อมรันไทม์ที่ขนาดสแต็คสูงสุดไม่ได้ถูก จำกัด ไว้ล่วงหน้าโดยตัวเลือกเริ่มต้นหรือตัวเลือกคอมไพเลอร์ นี่คือสาเหตุที่การเรียกซ้ำมากเกินไปจะส่งผลให้เกิดข้อผิดพลาด / ข้อยกเว้นการโอเวอร์โฟลว์สแต็กอย่างรวดเร็วมากแม้ว่าจะมีการใช้หน่วยความจำเพียงเล็กน้อยในหน่วยความจำสำหรับกระบวนการ เหตุใดจึงเป็นกรณีที่สภาพแวดล้อมรันไทม์ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) ตั้งค่าขีด จำกัด สูงสุดสำหรับขนาดที่สแต็กสามารถโตขึ้นที่รันไทม์?
46 stack 

6
การใช้กองซ้อนโดยใช้สองคิวคืออะไร
ฉันมีคำถามทำการบ้านต่อไปนี้: ใช้วิธีการซ้อน (x) และ pop () โดยใช้สองคิว ดูเหมือนว่าจะแปลกสำหรับฉันเพราะ: Stack คือคิว (LIFO) ฉันไม่เห็นว่าทำไมคุณต้องใช้สองคิวในการติดตั้ง ฉันค้นหารอบ ๆ : GeeksForGeeks StackOverflow และพบวิธีแก้ไขปัญหาสองสามข้อ นี่คือสิ่งที่ฉันลงเอยด้วย: public class Stack<T> { LinkedList<T> q1 = new LinkedList<T>(); LinkedList<T> q2 = new LinkedList<T>(); public void push(T t) { q1.addFirst(t); } public T pop() { if (q1.isEmpty()) { throw new RuntimeException( …
34 java  stack 

6
เหตุใดโปรแกรมจึงใช้สแตกการโทรหากมีการเรียกใช้ฟังก์ชันซ้อนกัน?
ทำไมคอมไพเลอร์ถึงไม่มีโปรแกรมเช่นนี้: function a(b) { return b^2 }; function c(b) { return a(b) + 5 }; และแปลงเป็นโปรแกรมเช่นนี้: function c(b) { return b^2 + 5 }; ด้วยเหตุนี้จึงไม่จำเป็นต้องให้คอมพิวเตอร์จำที่อยู่ส่งคืนของ c (b) ฉันคิดว่าพื้นที่ฮาร์ดดิสก์ที่เพิ่มขึ้นและ RAM ที่จำเป็นในการจัดเก็บโปรแกรมและสนับสนุนการรวบรวม (ตามลำดับ) คือเหตุผลที่เราใช้ call stack ถูกต้องไหม

3
ทำไมกองเติบโตขึ้น
ฉันสมมติว่ามีประวัติ แต่ทำไมสแต็คถึงลง? ดูเหมือนว่าฉันชอบบัฟเฟอร์ล้นจะยากมากที่จะใช้ประโยชน์หากกองเติบโตขึ้น ...
31 cpu  stack 

1
คำอธิบายตัวชี้เฟรม
ในชุด MIPSมีการลงทะเบียนสำหรับตัวชี้สแต็กและการลงทะเบียนอีกครั้งสำหรับตัวชี้เฟรม ตัวชี้เฟรมคืออะไรและมีจุดประสงค์อะไร? มันแตกต่างจากตัวชี้สแต็คอย่างไร
28 assembly  stack 

6
เหตุใดเราจึงต้องมีฮีปหากทุกอย่างสามารถทำได้อย่างมีประสิทธิภาพมากขึ้นในสแต็ก
นี่เป็นคำถามเกี่ยวกับคำถามที่ฉันถามเมื่อวานนี้ว่าทำไมทั้ง Stack และ Heap จึงมีความจำเป็นในแอปพลิเคชันที่เราใช้ในวันนี้ (และทำไมเราไม่สามารถไปกับ Heap ได้แทนที่จะเป็นทั้งสองอย่าง มาตรฐานเอกพจน์ที่จะไปด้วย) อย่างไรก็ตามการตอบกลับจำนวนมากระบุว่า Stack ไม่สามารถถูกแทนที่ได้เนื่องจากความจริงที่ว่าเร็วกว่าการพยายามจัดสรร / อ้างอิงฮีปหลายร้อยครั้ง (หรือหลายพัน) ฉันรู้ว่ามีปัญหากับการจัดสรรพื้นที่จัดเก็บข้อมูลแบบไดนามิกถ้าเราจัดการกับ Heap แต่ไม่มีวิธีแก้ไขปัญหานี้หรืออาจเป็นวิธีการปรับปรุงใน Stack เพื่อให้สามารถจัดการการจัดสรรหน่วยความจำแบบไดนามิกได้
24 stack  heap 

4
เหตุใดการวางบางสิ่งบางอย่างลงบนสแต็กเรียกว่า“ push”
ตามที่http://dictionary.reference.com ดัน กริยา (ใช้กับวัตถุ) เพื่อกดหรือต้าน (สิ่ง) ด้วยกำลังเพื่อย้ายมันออกไป เพื่อย้าย (บางสิ่ง) ตามวิธีที่กำหนดโดยใช้กำลัง ซุก; ไดรฟ์: เพื่อผลักบางสิ่งไว้ข้างๆ ที่จะผลักดันเปิดประตู ที่จะทำให้เกิดผลหรือสำเร็จโดยการผลักสิ่งกีดขวางออกไป: ผลักทางผ่านฝูงชน ทำให้เกิดการขยายหรือโครงการ แรงผลักดัน เพื่อกดหรือกระตุ้นให้มีการกระทำหรือหลักสูตร: แม่ของเขาผลักเขาให้ได้งานทำ IMO นี้เหมาะกับคิวFIFO มีคำอธิบายสำหรับเรื่องนี้?

4
การใช้สแต็คมีมากเกินไปมากเกินไป?
เมื่อเร็ว ๆ นี้เมื่อฉันเขียน C หรือ C ++ ฉันจะประกาศตัวแปรทั้งหมดของฉันในสแต็คเพียงเพราะเป็นตัวเลือกซึ่งแตกต่างจาก Java อย่างไรก็ตามฉันได้ยินมาว่าเป็นความคิดที่ดีที่จะประกาศเรื่องใหญ่ ๆ ในกองซ้อน ทำไมเป็นกรณีนี้ ฉันคิดว่าสแต็กล้นมีส่วนเกี่ยวข้อง แต่ฉันไม่ชัดเจนว่าทำไมจึงเกิดขึ้น สแต็คมีมากน้อยเพียงใด? ฉันไม่ได้พยายามที่จะวางไฟล์ 100MB ในสแต็กเพียงหนึ่งโหลกิโลไบต์อาร์เรย์เพื่อใช้เป็นบัฟเฟอร์สตริงหรืออะไรก็ตาม มีการใช้งานสแต็กมากเกินไปหรือไม่ (ขออภัยหากซ้ำกันการค้นหาสแต็กยังคงให้การอ้างอิงถึงสแต็คโอเวอร์โฟลไม่มีแม้แต่สแต็กแท็กการโทรฉันเพิ่งใช้นามธรรมหนึ่ง)

2
ขนาดของ stack และ heap ถูก จำกัด โดยระบบปฏิบัติการอย่างไร
หมายเหตุ : หากคุณต้องการพิจารณาระบบปฏิบัติการเฉพาะเพื่อให้สามารถตอบได้โปรดพิจารณา Linux เมื่อใดก็ตามที่ฉันเรียกใช้โปรแกรมก็จะได้รับพื้นที่หน่วยความจำเสมือนที่จะทำงานโดยมีพื้นที่สำหรับสแต็กและอีกหนึ่งสำหรับฮีปของมัน คำถามที่ 1 : ทำสแต็กและฮีปมีขีด จำกัด ขนาดคงที่ (เช่น 2 กิกะไบต์แต่ละตัว) หรือเป็นขีด จำกัด แบบไดนามิกนี้เปลี่ยนไปตามการจัดสรรหน่วยความจำในระหว่างการดำเนินการของโปรแกรม (เช่น 4 กิกะไบต์ทั้งหมดที่จะใช้โดย ทั้งสองอย่างดังนั้นหากโปรแกรมใช้สแต็คเพียงอย่างเดียวมันจะสามารถมีสแต็คที่มี 4 กิกะไบต์) คำถามที่ 2 : กำหนดวงเงินอย่างไร มันเป็นหน่วยความจำแรมทั้งหมดที่มีอยู่ไหม? คำถามที่ 3 : ส่วนข้อความ (รหัส) และส่วนข้อมูลมีข้อ จำกัด อย่างไร
21 linux  memory  stack  heap 

4
ทำความเข้าใจกับกรอบสแต็คของการเรียกใช้ฟังก์ชันใน C / C ++ หรือไม่
ฉันกำลังพยายามที่จะเข้าใจว่าสแต็คเฟรมถูกสร้างขึ้นและตัวแปรใด (params) ถูกผลักไปยังสแต็กตามลำดับ ผลลัพธ์การค้นหาบางรายการแสดงว่าคอมไพเลอร์ C / C ++ ตัดสินใจตามการดำเนินการที่ดำเนินการภายในฟังก์ชั่น ตัวอย่างเช่นถ้าฟังก์ชั่นควรจะเพิ่มค่าการส่งผ่านโดย 1 (คล้ายกับตัวดำเนินการ ++) และส่งกลับมันจะทำให้พารามิเตอร์ทั้งหมดของฟังก์ชั่นและตัวแปรท้องถิ่นในการลงทะเบียน ฉันสงสัยว่าจะใช้รีจิสเตอร์ใดสำหรับพารามิเตอร์ส่งคืนหรือส่งผ่านตามค่า การอ้างอิงถูกส่งคืนอย่างไร คอมไพเลอร์เลือกระหว่าง eax, ebx, ecx และ edx อย่างไร ฉันต้องทราบอะไรบ้างในการทำความเข้าใจวิธีการลงทะเบียนการอ้างอิงสแต็คและฮีปที่ใช้สร้างและทำลายระหว่างการเรียกใช้ฟังก์ชัน
19 c++  c  compiler  stack 

4
เมื่อไม่มี TCO เมื่อใดต้องกังวลเกี่ยวกับการสแต็คกอง?
ทุกครั้งที่มีการอภิปรายเกี่ยวกับภาษาการเขียนโปรแกรมใหม่ที่กำหนดเป้าหมาย JVM ย่อมมีคนพูดถึงสิ่งต่าง ๆ เช่น: "JVM ไม่รองรับการปรับให้เหมาะสมแบบหางเรียกดังนั้นฉันทำนายสแต็กการระเบิดจำนวนมาก" ชุดรูปแบบนั้นมีการเปลี่ยนแปลงหลายพันรายการ ตอนนี้ฉันรู้ว่าบางภาษาเช่น Clojure มีโครงสร้างการเกิดขึ้นเป็นพิเศษที่คุณสามารถใช้ สิ่งที่ฉันไม่เข้าใจคือ: การขาดการเพิ่มประสิทธิภาพการโทรหางมีความร้ายแรงเพียงใด? ฉันควรกังวลเกี่ยวกับเรื่องนี้เมื่อใด แหล่งที่มาหลักของความสับสนอาจมาจากความจริงที่ว่า Java เป็นหนึ่งในภาษาที่ประสบความสำเร็จมากที่สุดและภาษา JVM บางส่วนดูเหมือนจะทำได้ค่อนข้างดี วิธีการที่เป็นไปได้ถ้าขาดการ TCO เป็นจริงของใด ๆกังวล?

2
การวิเคราะห์ค่าตัดจำหน่าย? (การรับประกันประสิทธิภาพที่แย่ที่สุด)
การวิเคราะห์ค่าตัดจำหน่ายคืออะไร? และจะช่วยให้ฉันบรรลุผลการปฏิบัติงานที่เลวร้ายที่สุดในโปรแกรมของฉันได้อย่างไร? ฉันกำลังอ่านว่าเทคนิคต่อไปนี้สามารถช่วยโปรแกรมเมอร์ให้รับประกันประสิทธิภาพที่แย่ที่สุด (เช่นในคำพูดของฉันเอง: รับประกันว่าเวลาทำงานของโปรแกรมจะไม่เกินเวลาทำงานในระยะเวลาที่เลวร้ายที่สุด): อัลกอริธึมแบบสุ่ม (เช่นอัลกอริธึม quicksort เป็นกำลังสองในกรณีที่เลวร้ายที่สุด แต่การเรียงลำดับแบบสุ่มอินพุตให้การรับประกันความน่าจะเป็นว่าเวลาการทำงานของมันคือ linearithmic) ลำดับของการดำเนินการ (การวิเคราะห์ของเราต้องคำนึงถึงทั้งข้อมูลและลำดับของการดำเนินการที่ดำเนินการโดยลูกค้า) การวิเคราะห์ค่าตัดจำหน่าย (อีกวิธีหนึ่งในการรับประกันประสิทธิภาพคือการตัดจำหน่ายต้นทุนโดยการติดตามค่าใช้จ่ายทั้งหมดของการดำเนินงานทั้งหมดหารด้วยจำนวนการปฏิบัติงานในการตั้งค่านี้เราสามารถอนุญาตการดำเนินการบางอย่างที่มีราคาแพง ของการดำเนินการต่ำกล่าวอีกนัยหนึ่งเรากระจายค่าใช้จ่ายของการดำเนินการที่มีราคาแพงเพียงไม่กี่แห่งโดยมอบหมายส่วนหนึ่งให้กับการดำเนินการที่ไม่แพงจำนวนมาก) ผู้เขียนกล่าวถึงการใช้การปรับขนาดโครงสร้างข้อมูลอาร์เรย์สำหรับ Stackเป็นตัวอย่างหนึ่งของวิธีการวิเคราะห์ค่าตัดจำหน่าย แต่ฉันยังไม่เข้าใจว่าการวิเคราะห์ค่าตัดจำหน่ายคืออะไรและสามารถนำไปใช้จริงได้อย่างไร (โครงสร้างข้อมูล? อัลกอริทึม?) - รับประกันประสิทธิภาพการออกอากาศ

5
มีข้อเสียเปรียบในการจัดสรรสแต็กจำนวนมากสำหรับอาร์เรย์เดียวในระบบฝังตัวหรือไม่?
ฉันมักจะไม่มีปัญหาในการตัดสินใจว่าข้อมูลบางอย่างจะต้องเป็นแบบโกลบอลสแตติกหรือบนสแต็ก (ไม่มีการจัดสรรแบบไดนามิกที่นี่ดังนั้นจึงไม่มีการใช้ฮีป) ฉันได้อ่านคำถามสองสามข้อเช่นคำถามนี้แต่คำถามของฉันเฉพาะเจาะจงมากขึ้นเพราะมันเกี่ยวข้องกับข้อมูลจำนวนมากมากเมื่อเทียบกับหน่วยความจำระบบ ฉันกำลังใช้งานโค้ดที่มีอยู่ซึ่งฉันพยายามปรับปรุง (ออกแบบปัญหาที่เป็นไปได้การแสดง ฯลฯ ) รหัสนี้วิ่งบน MCU 8bit เก่ามีเพียง4KB ของแรม ในรหัสนี้ฉันต้องเผชิญกับการใช้งานของอาร์เรย์เกือบ 1KB (ใช่1KB ในระบบRAM 4KB ) แต่ละไบต์ของอาร์เรย์นี้ถูกใช้นั่นไม่ใช่คำถาม ปัญหาคือว่าอาร์เรย์นี้เป็นอาร์เรย์แบบคงที่ในไฟล์ที่มีการประกาศดังนั้นวงจรชีวิตของมันเป็นเช่นเดียวกับโปรแกรมหนึ่ง (เช่นถือได้ว่าไม่มีที่สิ้นสุด) อย่างไรก็ตามหลังจากอ่านโค้ดฉันเพิ่งค้นพบว่าอาเรย์นี้ไม่จำเป็นต้องมีวงจรชีวิตที่ไม่มีที่สิ้นสุดมันถูกสร้างและจัดการด้วยวิธีการที่สมบูรณ์ดังนั้นเราควรจะสามารถประกาศได้เฉพาะในฟังก์ชั่นที่ใช้ วิธีนี้มันจะอยู่ในสแต็คและเราจะบันทึก 1KB ของ RAM นี้ ทีนี้คำถาม: นี่เป็นความคิดที่ดีไหม? จากมุมมองการออกแบบหากไม่ต้องการวงจรชีวิตที่ไม่มีที่สิ้นสุด / ทั่วโลกมันเป็นของสแต็ค แต่เดี๋ยวก่อนนั่นคือ 1KB จาก 4KB ไม่มีข้อเสียในการจัดสรร RAM 25% ของแบบนี้ใช่ไหม? (นั่นอาจเป็น 50% หรือมากกว่าของสแต็ก) ใครบางคนสามารถแบ่งปันประสบการณ์บางอย่างกับสถานการณ์แบบนี้หรือใครบางคนคิดเกี่ยวกับเหตุผลที่ถูกต้องที่จะไม่วางอาร์เรย์นี้ในกอง? ฉันกำลังมองหาข้อเสียทางเทคนิคเช่นเดียวกับความคิดเห็นในการออกแบบ สิ่งเดียวที่ฉันใส่ใจคือฉันต้องทำให้แน่ใจว่าจริง ๆ แล้วฉันมีสแต็ก 1KB ฟรีเมื่อเข้าสู่ฟังก์ชันนี้ …

1
จุดประสงค์ของโซนสีแดงคืออะไร?
Red zone เป็นพื้นที่ขนาดคงที่ในหน่วยความจำเกินกว่าตัวชี้สแต็กที่ยังไม่ได้ "จัดสรร" คอมไพเลอร์สร้างแอสเซมบลีเพื่อเข้าถึงพื้นที่นั้นในฟังก์ชันใบไม้แบบง่าย แต่ฉันไม่เห็นข้อได้เปรียบที่แท้จริงของเขตสีแดง หน่วยความจำเข้าถึงเกินตัวชี้สแต็คเป็นสิ่งที่อันตรายมากและสามารถนำไปสู่ความเสียหายของข้อมูล ทำไมถึงทำเช่นนี้? การบันทึกคำสั่งของโปรเซสเซอร์ 2 ตัว (push ebp; mov ebp esp) จะไม่ทำให้ความเร็วเพิ่มขึ้นจริง
12 assembly  stack 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.