
กราฟเปรียบเทียบ
พื้นฐานสำหรับการเปรียบเทียบ | ใหม่ | malloc () |
---|---|---|
ภาษา | ตัวดำเนินการใหม่เป็นคุณลักษณะเฉพาะของ C ++, Java และ C # | ฟังก์ชั่น malloc () เป็นคุณสมบัติของ C |
ธรรมชาติ | "ใหม่" เป็นผู้ดำเนินการ | malloc () เป็นฟังก์ชัน |
ขนาดของ( ) | ใหม่ไม่ต้องการตัวดำเนินการ sizeof เพราะจัดสรรหน่วยความจำเพียงพอสำหรับชนิดที่ระบุ | malloc ต้องการให้ตัวดำเนินการ sizeof ทราบขนาดหน่วยความจำที่ต้องจัดสรร |
นวกรรมิก | ผู้ประกอบการใหม่สามารถเรียกตัวสร้างของวัตถุ | malloc () ไม่สามารถโทรไปที่ constructor ได้เลย |
การเริ่มต้น | ผู้ประกอบการใหม่สามารถเริ่มต้นวัตถุในขณะที่การจัดสรรหน่วยความจำ | การเริ่มต้นหน่วยความจำไม่สามารถทำได้ใน malloc |
การบรรทุกเกินพิกัด | ตัวดำเนินการใหม่สามารถโอเวอร์โหลดได้ | malloc () ไม่สามารถโอเวอร์โหลดได้ |
ความล้มเหลว | เกี่ยวกับความล้มเหลวผู้ประกอบการใหม่โยนข้อยกเว้น | เกี่ยวกับความล้มเหลว malloc () ส่งคืนค่า NULL |
deallocation | การจัดสรรหน่วยความจำโดยใหม่ยกเลิกการจัดสรรโดยใช้ "ลบ" | การจัดสรรหน่วยความจำโดย malloc () ถูกยกเลิกการจัดสรรโดยใช้ฟังก์ชัน free () |
การกำหนดใหม่ | ผู้ประกอบการใหม่ไม่ได้จัดสรรหน่วยความจำใหม่ | หน่วยความจำที่จัดสรรโดย malloc () สามารถจัดสรรใหม่ได้โดยใช้ realloc () |
การกระทำ | ผู้ประกอบการใหม่ลดเวลาดำเนินการ | malloc () ต้องใช้เวลาในการดำเนินการมากขึ้น |
คำจำกัดความใหม่
ตัวดำเนินการ ใหม่ เป็นตัวดำเนินการจัดสรรหน่วยความจำที่จัดสรรหน่วยความจำแบบไดนามิก ผู้ประกอบการใหม่จัดสรรหน่วยความจำในฮีปและส่งคืนที่อยู่เริ่มต้นของหน่วยความจำที่กำหนดให้กับตัวแปรอ้างอิง ตัวดำเนินการใหม่คล้ายกับ malloc () ใน C อย่างไรก็ตามคอมไพเลอร์ C ++ สามารถทำงานร่วมกับ malloc () ได้ แต่ควรใช้ตัวดำเนินการใหม่เนื่องจากมีข้อดีเหนือ malloc () ไวยากรณ์ของผู้ประกอบการใหม่มีดังนี้:
พิมพ์ variable_name = new type (parameter_list);
ที่นี่“ ประเภท” หมายถึงประเภทข้อมูลของตัวแปรที่ต้องจัดสรรหน่วยความจำ คำว่า "variable_name" เป็นชื่อที่กำหนดให้กับตัวแปรอ้างอิงที่เก็บตัวชี้ไปยังหน่วยความจำ วงเล็บที่นี่ระบุการเรียกของตัวสร้าง parameter_list เป็นรายการของค่าที่ส่งผ่านไปยังตัวสร้างเพื่อเริ่มต้นวัตถุที่สร้างขึ้นใหม่
ผู้ประกอบการใหม่จัดสรรหน่วยความจำเพียงพอที่จำเป็นสำหรับวัตถุประเภทที่เฉพาะเจาะจง ดังนั้นจึงไม่จำเป็นต้องใช้ตัวดำเนินการ sizeof () และไม่ต้องการปรับขนาดหน่วยความจำเช่น malloc () ซึ่งใช้ realloc () เพื่อจัดสรรหน่วยความจำใหม่ ผู้ประกอบการใหม่คือการสร้าง; มันเรียกนวกรรมิกของวัตถุในขณะที่การประกาศซึ่งโดยทั่วไปจะใช้ในการเริ่มต้นวัตถุ
เรารู้ว่าผู้ประกอบการใหม่จัดสรรหน่วยความจำในฮีปและขนาดของฮีปมี จำกัด ดังนั้นถ้าฮีปมีหน่วยความจำไม่เพียงพอและโอเปอเรเตอร์ใหม่พยายามที่จะจัดสรรหน่วยความจำมันจะนำไปสู่ความล้มเหลวของโอเปอเรเตอร์ใหม่ หากโอเปอเรเตอร์ใหม่ไม่สามารถจัดสรรหน่วยความจำได้จะมีข้อผิดพลาดเกิดขึ้นและหากรหัสของคุณไม่สามารถจัดการกับข้อยกเว้นนั้นได้โปรแกรมจะยุติการทำงานผิดปกติ
หน่วยความจำที่จัดสรรโดยผู้ประกอบการใหม่สามารถเป็นอิสระได้โดยใช้ตัวดำเนินการลบ ผู้ประกอบการใหม่ลดเวลาดำเนินการเนื่องจากเป็นผู้ดำเนินการไม่ใช่ฟังก์ชั่น
คำจำกัดความของ malloc ()
malloc () เป็นฟังก์ชันที่ใช้ในการจัดสรรจำนวนหน่วยความจำที่ร้องขอบนฮีป วิธีการส่งกลับตัวชี้ของ 'โมฆะ' ประเภทซึ่งเป็นเพิ่มเติมประเภทหล่อเพื่อรับตัวชี้ไปยังหน่วยความจำของประเภทที่ระบุและตัวชี้ไปยังหน่วยความจำนี้จะถูกกำหนดให้กับตัวแปรอ้างอิง ฟังก์ชัน malloc () คล้ายกับตัวดำเนินการใหม่ใน C ++ เนื่องจากใช้เพื่อจัดสรรหน่วยความจำแบบไดนามิก malloc () เป็นฟังก์ชันไลบรารีมาตรฐาน ไวยากรณ์ของฟังก์ชั่น malloc () เป็นดังนี้:
พิมพ์ variable_name = (type *) malloc (sizeof (type));
ที่นี่“ ประเภท” ระบุประเภทข้อมูลของตัวแปรที่ต้องจัดสรรหน่วยความจำ variable_name เป็นชื่อของตัวแปรอ้างอิงที่ตัวชี้กลับมาโดย malloc () จะถูกกำหนด (type *) อธิบายการส่งแบบเพื่อรับพอยน์เตอร์ไปยังหน่วยความจำในประเภทเฉพาะ sizeof () อธิบาย malloc () ว่าต้องใช้ขนาดหน่วยความจำเท่าใด
malloc () ต้องการการหล่อประเภทเนื่องจากตัวชี้ที่ส่งคืนโดย malloc () เป็นประเภทโมฆะดังนั้นในการกำหนดประเภทให้กับตัวชี้จำเป็นต้องใช้การหล่อประเภท ต้องการ sizeof () เนื่องจากฟังก์ชั่น malloc () จัดสรรหน่วยความจำดิบดังนั้นจึงจำเป็นต้องแจ้งให้ฟังก์ชั่น malloc () ว่าขนาดหน่วยความจำใดที่จะต้องจัดสรร หากหน่วยความจำที่จัดสรรไม่เพียงพอคุณสามารถปรับขนาดหรือจัดสรรใหม่โดยใช้ realloc ()
ฟังก์ชัน malloc () จัดสรรหน่วยความจำบนฮีป ในกรณีที่ฮีปมีหน่วยความจำไม่พอฟังก์ชัน malloc () จะส่งคืนพอยน์เตอร์ NULL ดังนั้นตัวแปรอ้างอิงที่มีตัวชี้ที่ส่งคืนโดย malloc () ควรตรวจสอบก่อนใช้งานมิฉะนั้นอาจทำให้ระบบล่มได้
หน่วยความจำที่จัดสรรโดยฟังก์ชัน malloc () ถูกจัดสรรคืนโดยใช้ free () เมื่อการเรียกใช้ฟังก์ชันนำไปสู่ค่าใช้จ่าย malloc () ต้องใช้เวลาในการดำเนินการมากขึ้น
ความแตกต่างที่สำคัญระหว่างใหม่และ malloc ()
- ตัวดำเนินการใหม่เป็นโครงสร้างที่นำมาใช้ใน C ++ และใช้ใน Java, C # ฯลฯ ในทางกลับกัน malloc () เป็นฟังก์ชันไลบรารีมาตรฐานที่พบเฉพาะในภาษา C และสนับสนุนโดย C ++
- ผู้ประกอบการใหม่จัดสรรหน่วยความจำเพียงพอสำหรับวัตถุประเภทที่ระบุดังนั้นจึงไม่จำเป็นต้องมีผู้ประกอบการปรับขนาด ในทางกลับกันฟังก์ชั่น malloc () ต้องใช้ตัวดำเนินการ sizeof () เพื่อให้ฟังก์ชั่นทราบว่าขนาดหน่วยความจำที่จะต้องจัดสรร
- ผู้ประกอบการใหม่สามารถเรียกตัวสร้างของวัตถุในขณะที่การประกาศ ในทางกลับกันฟังก์ชั่น malloc () ไม่สามารถเรียกตัวสร้าง
- โอเปอเรเตอร์ 'ใหม่' สามารถโหลดได้มากเกินไป แต่ malloc () ไม่สามารถทำได้
- หากผู้ประกอบการใหม่ล้มเหลวในการจัดสรรหน่วยความจำมันจะโยนข้อยกเว้นที่จะต้องจัดการโดยรหัสอื่นโปรแกรมจะยุติ ในทางกลับกันฟังก์ชัน malloc () จะส่งคืนตัวชี้ NULL หากไม่สามารถจัดสรรหน่วยความจำได้ หากใช้ตัวชี้โดยไม่ตรวจสอบสิ่งนี้จะส่งผลให้ระบบขัดข้อง
- หน่วยความจำที่จัดสรรโดยใช้โอเปอเรเตอร์ใหม่สามารถยกเลิกการจัดสรรโดยใช้ 'ลบ' ในทางกลับกันหน่วยความจำที่จัดสรรโดยใช้ฟังก์ชั่น malloc () สามารถจัดสรรคืนได้โดยใช้ฟรี ()
- เมื่อจัดสรรหน่วยความจำโดยใช้โอเปอเรเตอร์ใหม่แล้วจะไม่สามารถปรับขนาดได้ ในทางกลับกันหน่วยความจำที่จัดสรรโดยใช้ฟังก์ชั่น malloc () สามารถจัดสรรใหม่ (ปรับขนาด) โดยใช้ฟังก์ชั่น realloc ()
- เวลาดำเนินการของใหม่น้อยกว่าเมื่อเปรียบเทียบกับ malloc () เนื่องจาก malloc เป็นฟังก์ชันและใหม่คือโครงสร้าง
สรุป:
ฟังก์ชัน malloc () เป็นวิธีเก่าในการจัดสรรหน่วยความจำแบบไดนามิก ทุกวันนี้โอเปอเรเตอร์ใหม่จะถูกใช้เพื่อจัดสรรหน่วยความจำที่รันไทม์เนื่องจากมีข้อได้เปรียบเหนือ malloc ()