สวัสดีและยินดีต้อนรับกลับ ในการบรรยายนี้ ฉันต้องการพูดคุยเกี่ยวกับการจัดสรรหน่วยความจำแบบไดนามิก
สิ่งนี้เกี่ยวข้องโดยตรงกับพอยน์เตอร์ คุณสามารถใช้สิ่งนี้กับพอยน์เตอร์เท่านั้น
มาเริ่มกันเลยดีกว่า
ดังนั้น เมื่อใดก็ตามที่คุณกำหนดตัวแปรใน
c คอมไพเลอร์จะจัดสรรจำนวนพื้นที่จัดเก็บที่ถูกต้องให้กับคุณโดยอัตโนมัติตามประเภทข้อมูล
เราได้เห็นสิ่งนี้มาโดยตลอด เมื่อเราสร้างจำนวนเต็ม ทุ่น สองเท่า เราไม่ต้องจัดสรรหน่วยความจำใดๆ
คอมไพเลอร์ทำเพื่อคุณ มันจัดสรรหน่วยความจำบางส่วน
กันไปสำหรับพอยน์เตอร์โดยวิธีการ เมื่อคุณสร้างพอยน์เตอร์ หน่วยความจำจะถูกจัดสรรให้คุณ
เพื่อจัดเก็บประเภทตัวชี้ ที่อยู่
ไม่ได้หมายความว่ามีการจัดสรรหน่วยความจำสำหรับที่อยู่นั้น
จนถึงตอนนี้ เมื่อใดก็ตามที่เรากำหนดข้อมูลให้กับ -- ให้กับตัวชี้
เราได้กำหนดตัวแปรที่มีอยู่ไว้เสมอ
ดังนั้น หากเราต้องการกำหนดข้อมูลให้กับพอยน์เตอร์
เราก็ได้ใช้เครื่องหมายและแอดเดรสของโอเปอเรเตอร์บนตัวแปรที่ตัวแปรได้จัดสรรหน่วยความจำไว้แล้ว
แต่ถ้าคุณต้องการสร้างพอยน์เตอร์และคุณไม่ต้องการกำหนดที่อยู่ของโอเปอเรเตอร์นั้น
คุณต้องการจัดสรรหน่วยความจำแบบไดนามิก นั่นคือสิ่งที่การบรรยายทั้งหมดนี้เป็นเรื่องเกี่ยวกับ
ดังนั้นจึงควรจัดสรรพื้นที่เก็บข้อมูลแบบไดนามิกในขณะที่โปรแกรมกำลังทำงานอยู่
จัดสรรหน่วยความจำตามที่คุณต้องการ
หากคุณมีโปรแกรมที่ออกแบบมาเพื่ออ่านในชุดข้อมูลจากไฟล์ไปยังอาร์เรย์ในหน่วยความจำ
คุณมีสามตัวเลือก
คุณสามารถกำหนดอาร์เรย์ให้มีจำนวนองค์ประกอบที่เป็นไปได้สูงสุดที่รวบรวมเวลาซึ่งเป็นขนาดคงที่
หากคุณกำหนดอาร์เรย์ที่มีองค์ประกอบ 50 รายการ ก็จะมีเพียง
50 องค์ประกอบเท่านั้น คอมไพเลอร์กำหนดว่ามันคือ 50 มันจะจัดสรรหน่วยความจำให้มากเมื่อรัน
คุณสามารถใช้อาร์เรย์ความยาวผันแปรกับมิติขนาดของรันไทม์อาร์เรย์ได้
เราได้พูดคุยกันเล็กน้อยเกี่ยวกับอาร์เรย์ความยาวผันแปรเหล่านี้
ซึ่งยังไม่รองรับจนถึง C11 พวกเขากำลังเอา C11 ออก พวกเขากำลังเพิ่ม C99
นี่คือที่ที่คุณสามารถใส่ตัวแปรได้
แต่สิ่งเหล่านี้ยังคงเป็นขนาดคงที่เพราะนั่นหมายถึงอาร์เรย์ที่เชื่อมโยงตัวแปร
หมายความว่าคุณสามารถส่งผ่านตัวแปรสำหรับขนาดได้
แต่พวกมันยังคงนิ่งอยู่
หรือตัวเลือกที่ดีที่สุดคือคุณสามารถจัดสรรอาร์เรย์แบบไดนามิกได้ตามที่คุณต้องการ
และมีฟังก์ชัน c ต่างๆ ที่คุณสามารถเรียกใช้ได้
ดังนั้นจะมีประโยชน์มากในการจัดสรรหน่วยความจำแบบไดนามิก
ด้วยแนวทางแรกที่เราทำมาจนถึงตอนนี้ ไม่ว่าจะเป็นอาร์เรย์หรือประเภทข้อมูล
จะเป็นขนาดคงที่
คุณต้องกำหนดอาร์เรย์ของคุณเพื่อให้มีจำนวนองค์ประกอบสูงสุดที่จะอยู่ในอาร์เรย์
ดังนั้นคุณจะทำสิ่งนี้ int dataArray [1000]
สิ่งนี้หมายความว่าอย่างไร ไฟล์ข้อมูลไม่สามารถมีองค์ประกอบได้มากกว่าหนึ่งพันรายการ
ถ้าเป็นเช่นนั้น โปรแกรมของคุณจะพัง
ดังนั้นคุณแค่ต้องหวังว่าไฟล์ใดก็ตามที่คุณกำลังอ่านอยู่จะมีข้อมูลไม่มากนัก
โปรแกรมของคุณจะไม่ทำงานกับไฟล์ขนาดใหญ่หรือไฟล์ขนาดใหญ่
และถ้าคุณต้องการทำงานกับไฟล์ขนาดใหญ่ คุณต้องย้อนกลับและคุณต้องทำให้อาร์เรย์ใหญ่ขึ้น
คุณต้องเปลี่ยนขนาด แต่คุณต้องคอมไพล์ใหม่อีกครั้ง
มันคือเวลาที่คอมไพล์
ไม่ว่าคุณจะเลือกค่าใด คุณก็มีโอกาสเจอปัญหาเดิมอีกครั้งในอนาคตเสมอ
เพราะเป็นขนาดที่ตายตัว
ขนาดนี้ถูกกำหนดเมื่อคุณคอมไพล์โค้ด
จะไม่ปรับเมื่อคุณรันโปรแกรม
มันไม่เปลี่ยนแปลงแบบไดนามิก
ด้วยการใช้ฟังก์ชันการจัดสรรหน่วยความจำแบบไดนามิก คุณสามารถรับที่เก็บข้อมูลได้ตามต้องการ
วิธีนี้ทำให้คุณสามารถจัดสรรหน่วยความจำได้ในขณะที่โปรแกรมกำลังทำงาน
ลองนึกถึงข้อดีของสิ่งนี้ ก่อนอื่นคุณไม่ได้สร้างหน่วยความจำมากมายที่คุณอาจไม่ได้ใช้
แต่จะสร้างได้มากเท่าที่คุณต้องการเท่านั้น
และหากต้องการมากกว่านี้ คุณสามารถจัดสรรเพิ่มเติมได้
คุณไม่จำเป็นต้องกลับไปคอมไพล์ใหม่และเปลี่ยนขนาด
ดังนั้นการจัดสรรหน่วยความจำแบบไดนามิกจึงเป็นวิธีที่จะไป
ขึ้นอยู่กับแนวคิดของพอยน์เตอร์และเป็นแรงจูงใจที่ดีในการใช้พอยน์เตอร์ในโค้ดของคุณ
ดังนั้นเราจึงพูดถึงข้อดีของพอยน์เตอร์
และคุณอาจคิดดีแล้ว โอเค พวกมันเป็นแนวคิดที่เจ๋ง แต่ทำไมเราถึงต้องใช้มัน
นี่คือหนึ่งในเหตุผลใหญ่ ดังนั้นคุณจึงสามารถจัดสรรหน่วยความจำแบบไดนามิกได้
และอีกครั้ง นี่คืออะไร -- C เป็นเรื่องเกี่ยวกับการใช้ภาษาที่มีประสิทธิภาพและไม่ต้องใช้หน่วยความจำมาก
ดังนั้น c ทำงานบนระบบฝังตัว การเขียนโปรแกรมตามเวลาจริง
และนี่คือสาเหตุหนึ่งที่เพราะคุณสามารถจำกัดจำนวนหน่วยความจำที่คุณใช้ตามความต้องการ
ดังนั้นการจัดสรรหน่วยความจำแบบไดนามิกจึงทำให้หน่วยความจำสำหรับจัดเก็บข้อมูลได้รับการจัดสรรแบบไดนามิกเมื่อโปรแกรมดำเนินการ
การจัดสรรหน่วยความจำแบบไดนามิกทำได้เพียงเพราะคุณมีพอยน์เตอร์ที่พร้อมใช้งาน
เนื่องจากคุณมีที่อยู่และคุณสามารถเปลี่ยนจำนวนตัวชี้ที่ชี้ไป
คุณจึงสามารถปรับหน่วยความจำใหม่ได้
โปรแกรมที่ใช้งานจริงส่วนใหญ่จะใช้การจัดสรรหน่วยความจำแบบไดนามิก
หากคุณกำลังเขียนโค้ดในภาษา c คุณจะต้องใช้สิ่งนี้
แม้ว่าคุณจะเป็นมือใหม่ คุณจะต้องใช้การจัดสรรหน่วยความจำแบบไดนามิก
โปรแกรมที่มีประโยชน์ส่วนใหญ่จะใช้แนวคิดนี้
การจัดสรรข้อมูลแบบไดนามิกช่วยให้คุณสร้างพอยน์เตอร์ขณะรันไทม์ซึ่งมีขนาดใหญ่พอที่จะรองรับปริมาณข้อมูลที่คุณต้องการสำหรับงานได้
ดังนั้นคุณจึงไม่เปลืองหน่วยความจำ
สำคัญยิ่ง.
เราต้องพูดถึงฮีปกับสแต็กด้วย
มีสองวิธีที่คุณสามารถจัดเก็บหน่วยความจำในโปรแกรม โครงสร้างข้อมูลสองแบบที่คุณสามารถจัดเก็บข้อมูลบนสแต็ก
หรือคุณสามารถเก็บข้อมูลบนฮีปได้
การจัดสรรหน่วยความจำแบบไดนามิกจะสงวนทุกอย่างในฮีป
เราจะไม่ลงรายละเอียดว่าสิ่งเหล่านี้ถูกจัดระเบียบอย่างไร แต่โดยพื้นฐานแล้ว
เมื่อคุณจัดเก็บข้อมูลบนฮีปจะช่วยให้เปลี่ยนแปลงได้มากขึ้น
คุณสามารถเปลี่ยนขนาดของอ็อบเจ็กต์ข้อมูลได้ตามอำเภอใจ และมันจะคงอยู่นานขึ้นมากเมื่อคุณจัดสรรหน่วยความจำในฮีป
มันจะเกาะติดทั่วทั้งโปรแกรมของคุณ
เมื่อคุณใช้สแต็ค มันจะจำกัดมากขึ้น
สแต็กใช้สำหรับทุกอย่างตั้งแต่อาร์กิวเมนต์ของฟังก์ชันและตัวแปรโลคัล
ที่ซึ่งทุกสิ่งเหล่านั้นถูกเก็บไว้
นั่นคือเหตุผลที่เราพูดถึง call stack
โดยดูจากวิธีการและหน้าที่
ฉันใช้เมธอดเป็นระยะๆ
แต่เมธอดเป็นคำศัพท์เชิงวัตถุจริงๆ ดังนั้นจึงใช้งานได้
ทุกอย่างที่เกี่ยวข้องกับฟังก์ชันจะถูกสร้างขึ้นบนสแต็ก
นั่นหมายความว่าเมื่อคุณเรียกใช้ฟังก์ชัน
ฟังก์ชันจะถูกวางบนสแต็ก ตัวแปรโลคัลวางบนสแต็ก
เมื่อคุณออกจากฟังก์ชัน ทุกอย่างจะถูกลบ
ดังนั้นหน่วยความจำที่อยู่บนสแต็กจึงไม่ติดอยู่นานนัก
นั่นเป็นหนึ่งในเหตุผลเมื่อคุณจัดสรรหน่วยความจำแบบไดนามิกให้อยู่ในฮีป
เนื่องจากคุณควบคุมเวลาที่คุณใช้หน่วยความจำ
และเมื่อคุณไม่ได้ใช้หน่วยความจำ คุณจะจัดสรรและลบทิ้ง
สิ่งที่คุณควบคุมไม่ได้ จะถูกลบโดยอัตโนมัติ ได้รับการจัดสรรโดยอัตโนมัติ
ดังนั้นตัวแปรโลคัล ตัวแปรภายในฟังก์ชันเช่น main ตัวแปรเหล่านี้จะถูกสร้างขึ้นบนสแต็กเป็นต้น
หน่วยความจำในฮีปต่างกัน โดยคุณ โปรแกรมเมอร์เป็นผู้ควบคุม
เมื่อคุณจัดสรรหน่วยความจำบนฮีป คุณจะติดตามว่าเมื่อใดที่คุณมีหน่วยความจำ คุณไม่จำเป็นต้องจัดสรรแล้ว
ดังนั้นคุณต้องลบหน่วยความจำ
คุณต้องเพิ่มพื้นที่ว่างเมื่อคุณไม่ได้ใช้งานอีกต่อไป
และนี่เป็นสิ่งสำคัญเพราะหน่วยความจำเป็นทรัพยากรที่หายากมาก
วันนี้เรามีหน่วยความจำมากมายที่คุณสามารถเรียกใช้คอมพิวเตอร์
12 กิ๊ก 16 กิ๊กอะไรก็ได้ แต่สำหรับโปรแกรมที่ฝังอยู่ในอุปกรณ์
คุณไม่จำเป็นต้องมีหน่วยความจำมากขนาดนั้น
ดังนั้น
คุณต้องการควบคุมปริมาณการใช้หน่วยความจำ และคุณต้องการปล่อยหน่วยความจำเมื่อคุณใช้งานเสร็จแล้ว เพื่อให้แอปพลิเคชันอื่นๆ
สามารถใช้งานได้
อีกครั้งที่สำคัญกว่าในระบบฝังตัวระดับต่ำ
แต่นี่เป็นเสรีภาพที่หลายภาษาไม่มี ความสามารถในการควบคุมหน่วยความจำผู้จัดการของคุณโดยโปรแกรมเมอร์
และทำให้โปรแกรมมีประสิทธิภาพมากขึ้นและเร็วขึ้นมาก
ดังนั้นในการบรรยายครั้งต่อไป เราจะพูดถึงว่าคุณทำได้จริงอย่างไร
ฟังก์ชันใดที่คุณสามารถเรียกใช้ได้ เห็นได้ชัดว่ามีฟังก์ชั่นต่าง ๆ ที่คุณสามารถเรียกใช้เพื่อจัดสรรหน่วยความจำให้เป็นหน่วยความจำว่างได้
ขอขอบคุณ.