แนะนำ, 2024

ตัวเลือกของบรรณาธิการ

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

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

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

พื้นฐานสำหรับการเปรียบเทียบใหม่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 ()

  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 ()

Top