แนะนำ, 2024

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

ความแตกต่างระหว่าง Inline และ Macro ใน C ++

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

ลองศึกษาความแตกต่างระหว่างอินไลน์และมาโครด้วยความช่วยเหลือของกราฟเปรียบเทียบ

แผนภูมิเปรียบเทียบ

พื้นฐานสำหรับการเปรียบเทียบinlineมาโคร
ขั้นพื้นฐานฟังก์ชันอินไลน์ถูกวิเคราะห์คำโดยคอมไพเลอร์แมโครถูกขยายโดยตัวประมวลผลล่วงหน้า
วากยสัมพันธ์อินไลน์ return_type funct_name (พารามิเตอร์) {. . . }#define macro_name char_sequence
คำหลักที่ใช้แบบอินไลน์
#กำหนด
ที่กำหนดไว้สามารถกำหนดภายในหรือภายนอกชั้นเรียนมันถูกกำหนดไว้เสมอเมื่อเริ่มต้นโปรแกรม
การประเมินผลมันประเมินข้อโต้แย้งเพียงครั้งเดียวมันประเมินข้อโต้แย้งทุกครั้งที่มีการใช้ในรหัส
การขยายตัวคอมไพเลอร์อาจไม่อินไลน์และขยายฟังก์ชั่นทั้งหมดแมโครจะถูกขยายเสมอ
การทำงานอัตโนมัติฟังก์ชั่นสั้น ๆ ที่กำหนดไว้ในชั้นเรียนจะทำโดยอัตโนมัติในฟังก์ชั่นแบบอินไลน์ควรกำหนดมาโครเป็นพิเศษ
การเข้าถึงฟังก์ชั่นสมาชิกแบบอินไลน์สามารถเข้าถึงข้อมูลสมาชิกของชั้นเรียนแมโครไม่สามารถเป็นสมาชิกของคลาสและไม่สามารถเข้าถึงข้อมูลสมาชิกของคลาสได้
การสิ้นสุดนิยามของฟังก์ชั่นอินไลน์สิ้นสุดลงด้วยวงเล็บปีกกาที่ท้ายฟังก์ชั่นอินไลน์นิยามของแมโครยุติด้วยบรรทัดใหม่
แก้จุดบกพร่องการดีบักเป็นเรื่องง่ายสำหรับฟังก์ชั่นอินไลน์เนื่องจากการตรวจสอบข้อผิดพลาดเสร็จสิ้นในระหว่างการคอมไพล์การดีบักกลายเป็นเรื่องยากสำหรับแมโครเนื่องจากการตรวจสอบข้อผิดพลาดจะไม่เกิดขึ้นระหว่างการรวบรวม
ผูกพันฟังก์ชั่นอินไลน์ผูกคำสั่งทั้งหมดในร่างกายของฟังก์ชั่นได้เป็นอย่างดีเช่นเดียวกับร่างกายของฟังก์ชั่นเริ่มต้นและสิ้นสุดด้วยวงเล็บปีกกาแมโครประสบปัญหาการเชื่อมโยงหากมีคำสั่งมากกว่าหนึ่งคำสั่งเนื่องจากไม่มีสัญลักษณ์การเลิกจ้าง

คำจำกัดความของ Inline

ฟังก์ชั่นแบบอินไลน์ดูเหมือนว่าฟังก์ชั่นปกติ แต่นำหน้าด้วยคำหลัก " inline " ฟังก์ชั่นแบบอินไลน์คือฟังก์ชั่นความยาวสั้นซึ่งจะขยายที่จุดของการร้องขอแทนที่จะถูกเรียก มาทำความเข้าใจฟังก์ชั่นอินไลน์ด้วยตัวอย่าง

 # รวมถึงการใช้เนมสเปซ std; ตัวอย่างคลาส {int a, b; สาธารณะ: อินไลน์โมฆะเริ่มต้น (int x, int y) {a = x; b = y} การแสดงผลเป็นโมฆะ () {ศาล << a << "" < 

ในโปรแกรมข้างต้นฉันประกาศและกำหนดฟังก์ชั่นการเริ่มต้น () เป็นฟังก์ชั่นแบบอินไลน์ในระดับ“ ตัวอย่าง” รหัสของการเริ่มต้น () ฟังก์ชั่นจะขยายที่มันถูกเรียกโดยวัตถุของคลาส "ตัวอย่าง" ฟังก์ชั่นการแสดงผล () ที่กำหนดไว้ในตัวอย่างชั้นไม่ได้ประกาศแบบอินไลน์ แต่มันอาจจะพิจารณาแบบอินไลน์โดยคอมไพเลอร์ ใน C ++ ฟังก์ชั่นที่กำหนดไว้ในชั้นเรียนจะถูกสร้างขึ้นโดยอัตโนมัติโดยคอมไพเลอร์พิจารณาความยาวของฟังก์ชั่น

  • ฟังก์ชั่นแบบอินไลน์ช่วยลดค่าใช้จ่ายของการเรียกใช้ฟังก์ชันและส่งคืนซึ่งจะช่วยลดเวลาในการดำเนินการของโปรแกรม นอกจากนี้ยังมีการส่งข้อโต้แย้งไปยังสแต็กและการลงทะเบียนจะถูกบันทึกไว้เมื่อมีการเรียกใช้ฟังก์ชันและรีเซ็ตเมื่อฟังก์ชันส่งคืนซึ่งใช้เวลาจึงหลีกเลี่ยงการทำงานแบบอินไลน์เนื่องจากไม่จำเป็นต้องสร้างตัวแปรท้องถิ่นและพารามิเตอร์ทางการในแต่ละครั้ง .
  • ฟังก์ชั่นแบบอินไลน์สามารถเป็นสมาชิกของชั้นเรียนและยังสามารถเข้าถึงข้อมูลสมาชิกของชั้นเรียน
  • ฟังก์ชั่นแบบอินไลน์ช่วยลดเวลาในการดำเนินการของโปรแกรม แต่บางครั้งหากความยาวของฟังก์ชั่นแบบอินไลน์มากกว่านั้นขนาดของโปรแกรมก็จะเพิ่มขึ้นเนื่องจากรหัสที่ซ้ำกัน ดังนั้นจึงเป็นวิธีปฏิบัติที่ดีในการทำหน้าที่เล็กมาก ๆ
  • ข้อโต้แย้งของฟังก์ชั่นแบบอินไลน์ถูกประเมินเพียงครั้งเดียว

นิยามของมาโคร

มาโครคือ“ คำสั่งตัวประมวลผลล่วงหน้า” ก่อนการรวบรวมโปรแกรมจะถูกตรวจสอบโดยตัวประมวลผลล่วงหน้าและเมื่อใดก็ตามที่พบแมโครในโปรแกรมมันจะแทนที่แมโครนั้นด้วยคำจำกัดความ ดังนั้นมาโครถือว่าเป็น "การแทนที่ข้อความ" ให้เราศึกษามาโครพร้อมกับตัวอย่าง

 #include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "มากกว่า 10 และ 20 คือ" << GREATER ("20", "10") << "\ n"; กลับ 0 } 

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

  • แมโครถูกกำหนดไว้ในตัวพิมพ์ใหญ่เสมอเพื่อให้ง่ายสำหรับโปรแกรมเมอร์ในการระบุมาโครทั้งหมดในโปรแกรมขณะที่อ่าน
  • แมโครไม่สามารถเป็นฟังก์ชันสมาชิกของคลาสได้และไม่สามารถเข้าถึงข้อมูลสมาชิกของคลาสใด ๆ ได้
  • ฟังก์ชั่นมาโครประเมินค่าอาร์กิวเมนต์แต่ละครั้งที่ปรากฏในการกำหนดซึ่งส่งผลให้เกิดผลลัพธ์ที่ไม่คาดคิด
  • มาโครต้องมีขนาดเล็กลงเนื่องจากมาโครที่มีขนาดใหญ่กว่านั้นจะเพิ่มขนาดรหัสโดยไม่จำเป็น

ความแตกต่างที่สำคัญระหว่าง Inline และ Macro

  1. ความแตกต่างพื้นฐานระหว่างอินไลน์และแมโครคือฟังก์ชั่นอินไลน์ถูกแยกวิเคราะห์โดยคอมไพเลอร์ในขณะที่มาโครในโปรแกรมจะถูกขยายโดยตัวประมวลผลล่วงหน้า
  2. คำหลักที่ใช้ในการกำหนดฟังก์ชั่นแบบอินไลน์คือ“ inline ” ในขณะที่คำหลักที่ใช้ในการกำหนดแมโครคือ“ #define
  3. เมื่อฟังก์ชั่นแบบอินไลน์เป็น decalre ภายในชั้นเรียนมันสามารถกำหนดได้ทั้งในชั้นเรียนหรือนอกชั้นเรียน ในทางกลับกันแมโครจะถูกกำหนดเสมอเมื่อเริ่มต้นโปรแกรม
  4. อาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันแบบอินไลน์จะถูกประเมินค่าเพียงครั้งเดียวในขณะที่รวบรวมในขณะที่อาร์กิวเมนต์แมโครจะถูกประเมินค่าทุกครั้งที่มีการใช้แมโครในโค้ด
  5. คอมไพเลอร์อาจไม่อินไลน์และขยายฟังก์ชั่นทั้งหมดที่กำหนดไว้ภายในชั้นเรียน ในทางกลับกันแมโครจะถูกขยายเสมอ
  6. ฟังก์ชั่นสั้น ๆ ที่กำหนดไว้ในชั้นเรียนที่ไม่มีคำหลักแบบอินไลน์จะทำฟังก์ชั่นแบบอินไลน์โดยอัตโนมัติ ในทางกลับกันควรกำหนดมาโครโดยเฉพาะ
  7. ฟังก์ชันที่เป็นแบบอินไลน์สามารถเข้าถึงสมาชิกของคลาสได้ในขณะที่แมโครไม่สามารถเข้าถึงสมาชิกของคลาสได้
  8. ในการยกเลิกฟังก์ชั่นแบบอินไลน์คุณจำเป็นต้องใช้ปีกกาแบบปิดในขณะที่แมโครจะถูกยกเลิกพร้อมกับเริ่มต้นบรรทัดใหม่
  9. การดีบักเป็นเรื่องง่ายสำหรับฟังก์ชั่น inlne เนื่องจากมีการตรวจสอบระหว่างการรวบรวมเพื่อหาข้อผิดพลาด ในทางกลับกันแมโครจะไม่ถูกตรวจสอบในขณะคอมไพล์ดังนั้นการดีบักแมโครกลายเป็นเรื่องยาก
  10. เป็นฟังก์ชั่นฟังก์ชั่นอินไลน์ผูกสมาชิกภายในเริ่มต้นและปิดวงเล็บปีกกา ในทางกลับกันแมโครไม่มีสัญลักษณ์การสิ้นสุดดังนั้นการโยงกลายเป็นเรื่องยากเมื่อแมโครมีมากกว่าหนึ่งคำสั่ง

สรุป:

ฟังก์ชั่นแบบอินไลน์มีความน่าเชื่อถือมากกว่าฟังก์ชั่นมาโคร C ++ ยังมีวิธีที่ดีกว่าในการกำหนดค่าคงที่ซึ่งใช้คำหลัก“ const”

Top