ความแตกต่างระหว่างใหม่และ malloc ()

ผู้เขียน: Laura McKinney
วันที่สร้าง: 1 เมษายน 2021
วันที่อัปเดต: 5 พฤษภาคม 2024
Anonim
Programming Interview: New and Delete in C++ vs malloc and free in C
วิดีโอ: Programming Interview: New and Delete in C++ vs malloc and free in C

เนื้อหา


ใหม่และ malloc () ทั้งสองถูกใช้เพื่อจัดสรรหน่วยความจำแบบไดนามิก แม้ว่าใหม่และ malloc () จะแตกต่างกันในข้อเสียมาก ความแตกต่างหลักระหว่างใหม่และ malloc () คือ ใหม่ เป็นผู้ประกอบการใช้เป็นโครงสร้าง ในทางกลับกัน malloc () เป็นฟังก์ชันไลบรารีมาตรฐานที่ใช้เพื่อจัดสรรหน่วยความจำขณะใช้งานจริง ความแตกต่างอื่น ๆ ระหว่างพวกเขาจะกล่าวถึงด้านล่างในแผนภูมิเปรียบเทียบ:

  1. แผนภูมิเปรียบเทียบ
  2. คำนิยาม
  3. ความแตกต่างที่สำคัญ
  4. ข้อสรุป

กราฟเปรียบเทียบ

พื้นฐานสำหรับการเปรียบเทียบใหม่malloc ()
ภาษาตัวดำเนินการใหม่เป็นคุณลักษณะเฉพาะของ C ++, Java และ C # ฟังก์ชั่น malloc () เป็นคุณสมบัติของ C
ธรรมชาติ"ใหม่" เป็นผู้ดำเนินการmalloc () เป็นฟังก์ชัน
ขนาดของ( )ใหม่ไม่ต้องการผู้ประกอบการ sizeof asit จัดสรรหน่วยความจำเพียงพอสำหรับประเภทที่เฉพาะเจาะจง 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 () ต้องใช้เวลาในการดำเนินการมากขึ้น

  1. ตัวดำเนินการใหม่เป็นโครงสร้างที่นำมาใช้ใน C ++ และใช้ใน Java, C # ฯลฯ ในทางกลับกัน malloc () เป็นฟังก์ชันไลบรารีมาตรฐานที่พบเฉพาะในภาษา C และสนับสนุนโดย C ++
  2. ตัวดำเนินการใหม่จะจัดสรรหน่วยความจำให้เพียงพอสำหรับวัตถุประเภทที่ระบุดังนั้นจึงไม่จำเป็นต้องใช้ตัวดำเนินการปรับขนาด ในทางกลับกันฟังก์ชั่น malloc () ต้องใช้ตัวดำเนินการ sizeof () เพื่อให้ฟังก์ชั่นทราบว่าขนาดหน่วยความจำที่จะต้องจัดสรร
  3. ผู้ประกอบการใหม่สามารถเรียกตัวสร้างของวัตถุในขณะที่การประกาศ ในทางกลับกันฟังก์ชั่น malloc () ไม่สามารถเรียกตัวสร้าง
  4. ผู้ประกอบการ 'ใหม่' สามารถโอเวอร์โหลดได้ แต่ malloc () ไม่สามารถทำได้
  5. หากผู้ประกอบการใหม่ล้มเหลวในการจัดสรรหน่วยความจำมันจะโยนข้อยกเว้นที่จะต้องจัดการโดยรหัสอื่นโปรแกรมจะยุติ ในทางกลับกันฟังก์ชัน malloc () จะส่งคืนตัวชี้ NULL หากไม่สามารถจัดสรรหน่วยความจำได้ หากใช้ตัวชี้โดยไม่ตรวจสอบสิ่งนี้จะทำให้ระบบล่ม
  6. หน่วยความจำที่จัดสรรโดยใช้โอเปอเรเตอร์ใหม่สามารถยกเลิกการจัดสรรโดยใช้ 'ลบ' ในทางกลับกันหน่วยความจำที่จัดสรรโดยใช้ฟังก์ชั่น malloc () สามารถยกเลิกการจัดสรรโดยใช้ฟรี ()
  7. เมื่อจัดสรรหน่วยความจำโดยใช้โอเปอเรเตอร์ใหม่แล้วจะไม่สามารถปรับขนาดได้ ในทางกลับกันหน่วยความจำที่จัดสรรโดยใช้ฟังก์ชั่น malloc () สามารถจัดสรรใหม่ (ปรับขนาด) โดยใช้ฟังก์ชั่น realloc ()
  8. เวลาดำเนินการของใหม่น้อยกว่าเมื่อเปรียบเทียบกับ malloc () เนื่องจาก malloc เป็นฟังก์ชันและใหม่คือโครงสร้าง

สรุป:

ฟังก์ชัน malloc () เป็นวิธีเก่าในการจัดสรรหน่วยความจำแบบไดนามิก ทุกวันนี้โอเปอเรเตอร์ใหม่จะถูกใช้เพื่อจัดสรรหน่วยความจำขณะรันไทม์เนื่องจากมีข้อได้เปรียบเหนือ malloc ()