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

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

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

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

5
Java Heap Allocation เร็วกว่า C ++
ฉันโพสต์คำถามนี้ไว้ใน SO แล้วและก็ใช้ได้ มันน่าเสียดายที่ปิด แต่ (ต้องการเพียงหนึ่งโหวตเพื่อเปิดใหม่) แต่มีคนแนะนำให้ฉันโพสต์ไว้ที่นี่เพราะมันเป็นแบบที่ดีกว่าดังนั้นต่อไปนี้เป็นสำเนาวางคำถามอย่างแท้จริง ฉันอ่านความคิดเห็นเกี่ยวกับคำตอบนี้และฉันเห็นข้อความนี้ การสร้างอินสแตนซ์ของวัตถุและคุณสมบัติเชิงวัตถุนั้นรวดเร็วในการใช้งาน (เร็วกว่า C ++ ในหลาย ๆ กรณี) เพราะพวกมันถูกออกแบบมาตั้งแต่ต้น และคอลเลกชันนั้นรวดเร็ว Java มาตรฐานชนะ C / C ++ มาตรฐานในพื้นที่นี้แม้สำหรับรหัส C ที่ปรับให้เหมาะสมที่สุด ผู้ใช้หนึ่งราย (ที่มีตัวแทนที่สูงมากฉันอาจเพิ่ม) ปกป้องข้อเรียกร้องนี้อย่างกล้าหาญโดยระบุว่า การจัดสรรฮีปใน java ดีกว่าของ C ++ และเพิ่มคำสั่งนี้เพื่อป้องกันการรวบรวมใน java และคอลเลกชัน Java นั้นเร็วกว่าคอลเลกชัน C ++ ซึ่งส่วนใหญ่จะเป็นระบบย่อยหน่วยความจำที่แตกต่างกัน ดังนั้นคำถามของฉันอาจเป็นจริงได้และถ้าเป็นเช่นนั้นเหตุใดการจัดสรรฮีปของ Java จึงเร็วขึ้นมาก

1
ทำไมหน่วยความจำหลักสำหรับการจัดสรรวัตถุจึงเรียกว่า 'ฮีป'
มีใครมีความคิดว่าเหตุใดพื้นที่ของหน่วยความจำหลักที่มีการจัดสรรออบเจ็กต์นั้นเรียกว่าฮีป ฉันเข้าใจเหตุผลของสแต็ค LIFO แต่อยากรู้ว่าเหตุผลคืออะไรสำหรับชื่อ 'heap'

3
ตัวอย่าง Array ความยาวตัวแปร C ที่ดี [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว คำถามนี้ค่อนข้างได้รับการแช่แข็งที่ดังนั้นฉันจึงตัดสินใจลบที่นั่นและลองที่นี่แทน หากคุณคิดว่ามันไม่พอดีที่นี่อย่างน้อยโปรดแสดงความคิดเห็นเกี่ยวกับคำแนะนำวิธีการหาตัวอย่างฉันหลังจาก ... คุณสามารถยกตัวอย่างได้หรือไม่ว่าการใช้ C99 VLA ให้ประโยชน์ที่เหนือกว่าบางอย่างเช่นฮีปมาตรฐานที่ใช้กลไก C ++ RAII ปัจจุบันหรือไม่ ตัวอย่างหลังจากฉันควร: บรรลุข้อได้เปรียบด้านประสิทธิภาพที่วัดได้ง่าย (10%) จากการใช้ heap ไม่มีวิธีแก้ปัญหาที่ดีซึ่งไม่จำเป็นต้องใช้ทั้งชุดเลย ประโยชน์ที่แท้จริงจากการใช้ขนาดไดนามิกแทนที่จะเป็นขนาดสูงสุดคงที่ ไม่น่าจะทำให้เกิดการล้นสแต็คในสถานการณ์การใช้งานปกติ แข็งแรงพอที่จะล่อลวงนักพัฒนาที่ต้องการประสิทธิภาพในการรวมไฟล์ต้นฉบับ C99 ในโครงการ C ++ การเพิ่มความกระจ่างเกี่ยวกับบริบท: ฉันหมายถึง VLA ตามความหมายโดย C99 และไม่รวมอยู่ในมาตรฐาน C ++: int array[n]โดยที่nเป็นตัวแปร และฉันเป็นตัวอย่างของกรณีการใช้งานที่มันสำคัญกว่าทางเลือกอื่น ๆ ที่เสนอโดยมาตรฐานอื่น ๆ (C90, C ++ 11): int …
9 c++  c  stack  heap 

3
ตัวจัดสรรฮีปแบบกำหนดเอง
โปรแกรมส่วนใหญ่ค่อนข้างไม่เป็นทางการเกี่ยวกับการจัดสรรฮีปแม้ภาษาที่ใช้งานโปรแกรมต้องการจัดสรรออบเจ็กต์ใหม่มากกว่าการดัดแปลงฮีทเก่าและปล่อยให้ผู้รวบรวมขยะกังวลเกี่ยวกับการปลดปล่อยสิ่งต่าง ๆ ในการเขียนโปรแกรมฝังตัวเซกเตอร์แบบเงียบอย่างไรก็ตามมีหลายแอปพลิเคชันที่คุณไม่สามารถใช้การจัดสรรฮีปได้ทั้งหมดเนื่องจากหน่วยความจำและข้อ จำกัด แบบเรียลไทม์ จำนวนวัตถุของแต่ละประเภทที่จะจัดการเป็นส่วนหนึ่งของข้อมูลจำเพาะและทุกอย่างได้รับการจัดสรรแบบคงที่ การเขียนโปรแกรมเกม (อย่างน้อยกับเกมที่มีความทะเยอทะยานเกี่ยวกับการผลักฮาร์ดแวร์) บางครั้งก็อยู่ระหว่าง: คุณสามารถใช้การจัดสรรแบบไดนามิก แต่มีหน่วยความจำเพียงพอและมีข้อ จำกัด แบบเรียลไทม์อ่อนที่คุณไม่สามารถถือว่าตัวจัดสรรเป็นกล่องดำ ให้ใช้การรวบรวมขยะอย่างเดียวดังนั้นคุณต้องใช้ตัวจัดสรรแบบกำหนดเอง นี่คือหนึ่งในเหตุผลที่ C ++ ยังคงใช้กันอย่างแพร่หลายในอุตสาหกรรมเกม มันช่วยให้คุณทำสิ่งต่าง ๆ เช่นhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html มีโดเมนอื่นใดบ้างที่อยู่ระหว่างนั้น? นอกเหนือจากเกมแล้วมีการใช้ตัวจัดสรรแบบกำหนดเองอย่างหนักที่ไหน?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.