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

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

9
ฉันเข้าใจว่าตัวชี้แบบสแต็คคืออะไร แต่ใช้เพื่ออะไร
ตัวชี้สแต็กชี้ไปที่ด้านบนของสแต็กซึ่งเก็บข้อมูลเกี่ยวกับสิ่งที่เราเรียกว่า "LIFO" เพื่อขโมยความคล้ายคลึงของคนอื่นมันเหมือนกับกองอาหารที่คุณใส่และนำไปปรุงอาหารที่ด้านบน ตัวชี้สแต็ก OTOH ชี้ไปที่ "จาน" ด้านบนของสแต็ก อย่างน้อยมันก็เป็นจริงสำหรับ x86 แต่ทำไมคอมพิวเตอร์ / โปรแกรม "สนใจ" ตัวชี้สแต็คชี้ไปที่อะไร? กล่าวอีกนัยหนึ่งจุดประสงค์อะไรที่มีตัวชี้สแต็กและการรู้ว่าจะให้บริการที่ใด คำอธิบายที่เข้าใจได้โดยโปรแกรมเมอร์ C จะได้รับการชื่นชม
11 stack  x86 

4
สแตกการโทรเริ่มที่ด้านล่างหรือด้านบน?
สแต็คเป็นสิ่งที่ซ้อนจากล่างขึ้นบน ดังนั้นสแต็กการโทรจะเพิ่มไอเท็มใหม่บนสแต็กเมื่อเรียกใช้ฟังก์ชันโดยไอเท็มจะถูกลบออกจากสแต็กเมื่อแต่ละฟังก์ชันสิ้นสุดลงจนกว่าสแต็กจะว่างเปล่าจากนั้นโปรแกรมจะสิ้นสุด หากข้อมูลด้านบนถูกต้องเหตุใดผู้คนจึงอ้างถึงการควบคุมการย้าย "up" ของ call stack? การควบคุมอย่างแน่นอนเลื่อนลงไปสแตกการโทรจนกว่าจะถึงด้านล่าง
11 functions  stack 

2
ขีด จำกัด ของสแต็ก
เมื่อเร็ว ๆ นี้ฉันได้ทดสอบขีด จำกัด ของสแต็คบนอุปกรณ์สามตัวที่มีระบบปฏิบัติการแตกต่างกัน (โดย จำกัด ฉันหมายถึงจำนวนสูงสุดของระดับที่สแต็กสามารถมีได้) และฉันสังเกตเห็นว่าทุกครั้งที่ฉันกดระดับ 2 ^ 16 ข้อผิดพลาดมากเกินไปและเมื่อฉันใส่ 2 ^ 16-1 มันทำงานได้อย่างถูกต้อง ดังนั้นคำถามของฉันคือ - จริงหรือ? สแต็กมีขีด จำกัด สูงสุด 2 ^ 16-1 ตามคำจำกัดความหรือขึ้นอยู่กับระบบปฏิบัติการ?
10 stack 

2
โครงสร้างสแต็กใช้สำหรับกระบวนการ async หรือไม่?
คำถามนี้มีคำตอบที่ยอดเยี่ยมโดย Eric Lippert อธิบายถึงกองที่ใช้ สำหรับปีที่ฉันรู้จัก - พูดโดยทั่วไป - สแต็คคืออะไรและใช้อย่างไร แต่บางส่วนของคำตอบของเขาทำให้ฉันสงสัยว่าโครงสร้างสแต็กนี้ใช้น้อยลงในวันนี้หรือไม่ซึ่งการเขียนโปรแกรม async เป็นบรรทัดฐาน จากคำตอบของเขา: สแต็คเป็นส่วนหนึ่งของการทำให้ใหม่ของความต่อเนื่องในภาษาโดยไม่ต้อง coroutines โดยเฉพาะอย่างยิ่งส่วนที่ไร้ coroutinesของนี้มีฉันสงสัย เขาอธิบายเพิ่มเติมอีกเล็กน้อยที่นี่: Coroutine เป็นฟังก์ชั่นที่จำได้ว่าอยู่ที่ไหนให้ผลการควบคุมไปยัง coroutine อีกระยะหนึ่งแล้วกลับมาทำงานต่อที่พวกมันทิ้งไว้ในภายหลัง แต่ไม่จำเป็นว่าจะต้องเกิดขึ้นทันทีหลังจาก coroutine ที่เพิ่งเรียกว่า คิดว่า "คืนผลตอบแทน" หรือ "รอ" ใน C # ซึ่งจะต้องจำไว้ว่าพวกเขาอยู่ที่ไหนเมื่อมีการร้องขอรายการถัดไปหรือการดำเนินการแบบอะซิงโครนัสเสร็จสมบูรณ์ ภาษาที่มี coroutines หรือฟีเจอร์ภาษาที่คล้ายกันนั้นต้องการโครงสร้างข้อมูลที่สูงกว่าสแต็กเพื่อที่จะใช้งานต่อเนื่อง นี่เป็นเรื่องที่ยอดเยี่ยมเกี่ยวกับสแต็ก แต่ทำให้ฉันมีคำถามที่ไม่ได้รับคำตอบเกี่ยวกับโครงสร้างที่ใช้เมื่อสแต็กนั้นง่ายเกินไปที่จะจัดการคุณสมบัติภาษาเหล่านี้ที่ต้องการโครงสร้างข้อมูลขั้นสูง? สแต็คจะหายไปเมื่อเทคโนโลยีก้าวหน้าไปหรือไม่? แทนที่มันคืออะไร มันเป็นลูกผสมหรือเปล่า (เช่นโปรแกรม. NET ของฉันจะใช้สแต็กจนกว่าจะถึงการเรียกใช้ async จากนั้นสลับไปยังโครงสร้างอื่น ๆ จนกว่าจะเสร็จสมบูรณ์ ณ จุดที่สแต็กนั้นกลับมาอยู่ในสถานะที่สามารถมั่นใจได้ในรายการถัดไป …
10 stack 

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

1
แนวคิดมันหมายความว่าอย่างไรเมื่อมีการกล่าวว่าแต่ละเธรดได้รับสแต็กของตัวเอง?
ฉันได้อ่านJava Concurrency ในทางปฏิบัติโดย Brian Goetz และในส่วนStack Confinementมีการกล่าวถึงว่าแต่ละเธรดได้รับสแต็กของตัวเองและตัวแปรในเครื่องจึง จำกัด อยู่ภายในเธรดที่กำลังดำเนินการ มีอยู่ในเธรดที่กำลังเรียกใช้งานซึ่งไม่สามารถเข้าถึงได้กับเธรดอื่น เขาหมายความว่าอะไรที่แต่ละเธรดมีสแตกการเรียกใช้ของตนเอง

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

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