Συνιστάται, 2024

Επιλογή Συντάκτη

Διαφορά μεταξύ Inline και Macro σε C ++

Η μακροεντολή είναι μια εντολή που επεκτείνεται κατά τη στιγμή της επίκλησής της. Μπορούν επίσης να οριστούν λειτουργίες, όπως μακροεντολές. Ομοίως, οι λειτουργίες inline αναπτύσσονται επίσης στο σημείο της επίκλησής τους. Μια κύρια διαφορά μεταξύ της λειτουργίας inline και της μακροεντολής είναι ότι οι λειτουργίες inline επεκτείνονται κατά τη διάρκεια της σύνταξης και οι μακροεντολές επεκτείνονται όταν το πρόγραμμα επεξεργάζεται από τον προεπεξεργαστή .

Ας μελετήσουμε τη διαφορά μεταξύ inline και macro με τη βοήθεια του πίνακα σύγκρισης.

Συγκριτικό διάγραμμα

Βάση σύγκρισηςΣτη γραμμήMacro
ΒασικόςΟι εσωτερικές λειτουργίες αναλύονται από τον μεταγλωττιστή.Οι μακροεντολές επεκτείνονται από τον προεπεξεργαστή.
Σύνταξηinline return_type funct_name (παράμετροι) {. . . }}#define όνομα_χρήστη char_sequence
Χρησιμοποιούνται λέξεις-κλειδιάστη γραμμή
#καθορίζω
ΟρίζεταιΜπορεί να οριστεί μέσα ή έξω από την τάξη.Καθορίζεται πάντα στην αρχή του προγράμματος.
ΕκτίμησηΑξιολογεί το επιχείρημα μόνο μία φορά.Αξιολογεί το επιχείρημα κάθε φορά που χρησιμοποιείται στον κώδικα.
ΕπέκτασηΟ μεταγλωττιστής δεν μπορεί να ενσωματωθεί και να επεκτείνει όλες τις λειτουργίες.Οι μακροεντολές διευρύνονται πάντοτε.
ΑυτοματοποίησηΟι σύντομες λειτουργίες που ορίζονται μέσα στην κλάση γίνονται αυτόματα σε ενσωματωμένες λειτουργίες.Οι μακροεντολές πρέπει να οριστούν ειδικά.
ΠρόσβασηΜια συνάρτηση inline μέλους μπορεί να έχει πρόσβαση στα μέλη δεδομένων της κλάσης.Οι μακροεντολές δεν μπορούν ποτέ να είναι μέλη της τάξης και δεν έχουν πρόσβαση στα δεδομένα των μελών της τάξης.
ΛήξηΟ ορισμός της λειτουργίας inline τερματίζεται με τις σγουρές αγκύλες στο τέλος της λειτουργίας inline.Ο ορισμός της μακροεντολής τερματίζεται με τη νέα γραμμή.
DebuggingΗ αποσφαλμάτωση είναι εύκολη για μια λειτουργία inline καθώς ο έλεγχος σφαλμάτων γίνεται κατά τη διάρκεια της σύνταξης.Η σάρωση γίνεται δύσκολη για τις μακροεντολές, καθώς ο έλεγχος σφαλμάτων δεν εμφανίζεται κατά τη διάρκεια της σύνταξης.
ΔεσμευτικόςΜια λειτουργία inline δεσμεύει πολύ καλά όλες τις δηλώσεις στο σώμα της λειτουργίας καθώς το σώμα της λειτουργίας αρχίζει και τελειώνει με τις σγουρές αγκύλες.Μια μακροεντολή αντιμετωπίζει το πρόβλημα σύνδεσης εάν έχει περισσότερες από μία εντολές, καθώς δεν έχει σύμβολο τερματισμού.

Ορισμός του Inline

Μια λειτουργία inline μοιάζει με μια κανονική λειτουργία, αλλά προηγείται της λέξης-κλειδί " inline ". Ενσωματωμένες λειτουργίες είναι λειτουργίες μικρού μήκους οι οποίες επεκτείνονται στο σημείο της κλήσης τους, αντί να καλούνται. Ας καταλάβουμε τις inline λειτουργίες με ένα παράδειγμα.

 #include using namespace std; Παράδειγμα κλάσης {int a, b; public: inline void initialize (int x, int y) {a = x; b = y} άκυρη απεικόνιση () {cout << a << "" < 

Στο παραπάνω πρόγραμμα, δηλώσαμε και ορίσαμε, την αρχικοποίηση των λειτουργιών (), ως συνάρτηση inline στην κλάση "παράδειγμα". Ο κώδικας της συνάρτησης αρχικοποίησης () θα επεκταθεί όπου θα καλείται από το αντικείμενο της κλάσης "παράδειγμα". Η οθόνη λειτουργίας (), που ορίζεται στο παράδειγμα κλάσης, δεν δηλώνεται εν σειρά, αλλά μπορεί να θεωρηθεί εν σειρά από τον μεταγλωττιστή, όπως στην C ++, η συνάρτηση που ορίζεται μέσα στην κλάση γίνεται αυτόματα από το compiler λαμβάνοντας υπόψη τη διάρκεια της λειτουργίας.

  • Η λειτουργία inline μειώνει την επιβάρυνση της κλήσης και επιστροφής των λειτουργιών, η οποία με τη σειρά της μειώνει τον χρόνο εκτέλεσης του προγράμματος. Επίσης, τα επιχειρήματα ωθούνται στη στοίβα και αποθηκεύονται οι καταχωρητές όταν μια λειτουργία καλείται και επαναφέρεται όταν η λειτουργία επιστρέφει, η οποία παίρνει χρόνο, αυτό αποφεύγεται από τις εσωτερικές λειτουργίες, καθώς δεν υπάρχει ανάγκη δημιουργίας τοπικών μεταβλητών και επίσημων παραμέτρων κάθε φορά .
  • Οι ενσωματωμένες λειτουργίες μπορούν να είναι μέλη της τάξης και μπορούν επίσης να έχουν πρόσβαση στο μέλος δεδομένων της τάξης.
  • Η λειτουργία Inline μειώνει τον χρόνο εκτέλεσης του προγράμματος, αλλά μερικές φορές εάν το μήκος της συνάρτησης inline είναι μεγαλύτερο τότε το μέγεθος του προγράμματος θα αυξηθεί επίσης λόγω του διπλότυπου κώδικα. Ως εκ τούτου, είναι καλή πρακτική να ενσωματωθούν πολύ μικρές λειτουργίες.
  • Το όρισμα της συνάρτησης inline αξιολογείται μόνο μία φορά.

Ορισμός της μακροεντολής

Η μακροεντολή είναι μια "οδηγία προεπεξεργαστών". Πριν από τη σύνταξη, το πρόγραμμα εξετάζεται από τον προεπεξεργαστή και όπου βρίσκει τη μακροεντολή στο πρόγραμμα, αντικαθιστά τη μακροεντολή από τον ορισμό της. Ως εκ τούτου, η μακροεντολή θεωρείται ως "αντικατάσταση κειμένου". Ας μελετήσουμε μακροεντολή με ένα παράδειγμα.

 #include #define ΕΞΑΙΡΕΤΙΚΗ (a, b) ((α <b); b: a) int main (void) {cout << "Μεγαλύτερη από 10 και 20 είναι" << ΜΕΓΑΛΗ ("20", "10") << "" \ n "; επιστροφή 0? }} 

Στον παραπάνω κώδικα, δηλώσαμε μια μακροεντολή GREATER (), η οποία συγκρίνει και βρίσκει τον μεγαλύτερο αριθμό και των δύο παραμέτρων. Μπορείτε να παρατηρήσετε ότι δεν υπάρχει ερωτηματικό για να τερματίσετε τη μακροεντολή καθώς η μακροεντολή τερματίζεται μόνο από τη νέα γραμμή. Δεδομένου ότι η μακροεντολή είναι απλώς μια αντικατάσταση κειμένου, θα επεκτείνει τον κώδικα της μακροεντολής όπου γίνεται επίκληση.

  • Οι μακροεντολές καθορίζονται πάντοτε με κεφαλαία γράμματα για να είναι εύκολο για τους προγραμματιστές να αναγνωρίζουν όλες τις μακροεντολές του προγράμματος κατά την ανάγνωση.
  • Η μακροεντολή δεν μπορεί ποτέ να είναι συνάρτηση μέλους μιας τάξης ούτε μπορεί να έχει πρόσβαση στα μέλη δεδομένων οποιασδήποτε κλάσης.
  • Η λειτουργία μακροεντολών αξιολογεί το όρισμα κάθε φορά που εμφανίζεται στον ορισμό του και οδηγεί σε ένα απροσδόκητο αποτέλεσμα.
  • Η μακροεντολή πρέπει να είναι μικρότερου μεγέθους, καθώς οι μεγαλύτερες μακροεντολές θα αυξήσουν άσκοπα το μέγεθος του κώδικα.

Βασικές διαφορές μεταξύ γραμμής και μακροεντολών

  1. Η βασική διαφορά μεταξύ inline και macro είναι ότι οι συνθέσεις inline αναλύονται από τον compiler, ενώ οι μακροεντολές σε ένα πρόγραμμα επεκτείνονται από τον preprocessor.
  2. Η λέξη-κλειδί που χρησιμοποιείται για τον ορισμό μιας συνάρτησης inline είναι " inline ", ενώ η λέξη-κλειδί που χρησιμοποιείται για τον ορισμό μιας μακροεντολής είναι " #define ".
  3. Μόλις η λειτουργία inline είναι decalre μέσα σε μια κλάση, μπορεί να οριστεί είτε μέσα σε μια τάξη είτε έξω από μια τάξη. Από την άλλη πλευρά, μια μακροεντολή ορίζεται πάντα στην αρχή του προγράμματος.
  4. Το όρισμα που μεταβιβάζεται στις λειτουργίες inline εκτιμάται μόνο μία φορά κατά τη σύνταξη, ενώ το όρισμα των μακροεντολών αξιολογείται κάθε φορά που χρησιμοποιείται μια μακροεντολή στον κώδικα.
  5. Ο μεταγλωττιστής δεν μπορεί να ενσωματώσει και να επεκτείνει όλες τις λειτουργίες που ορίζονται μέσα σε μια κλάση. Από την άλλη πλευρά, οι μακροεντολές διευρύνονται πάντοτε.
  6. Οι σύντομες λειτουργίες που ορίζονται μέσα σε μια κλάση χωρίς ενσωματωμένη λέξη-κλειδί γίνονται αυτόματα ενσωματωμένες λειτουργίες. Από την άλλη πλευρά, η μακροεντολή πρέπει να οριστεί ειδικά.
  7. Μια συνάρτηση που είναι ενσωματωμένη μπορεί να έχει πρόσβαση στα μέλη της κλάσης, ενώ μια μακροεντολή δεν μπορεί ποτέ να έχει πρόσβαση στα μέλη της τάξης.
  8. Για να τερματίσετε μια λειτουργία inline απαιτείται ένα κλειστό σγουρό κώλυμα, ενώ μια μακροεντολή τερματίζεται με την έναρξη μιας νέας γραμμής.
  9. Οι εντοπισμοί σφαλμάτων καθίστανται εύκολοι για την εσωτερική λειτουργία καθώς ελέγχονται κατά τη διάρκεια της σύνταξης για οποιοδήποτε σφάλμα. Από την άλλη πλευρά, μια μακροεντολή δεν ελέγχεται κατά τη διάρκεια της σύνταξης έτσι, η σάρωση μιας μακροεντολής γίνεται δύσκολη.
  10. Ως συνάρτηση, μια εσωτερική λειτουργία δεσμεύει τα μέλη της μέσα από ένα ξεκίνημα και κλειστά σγουράκια. Από την άλλη πλευρά, η μακροεντολή δεν έχει κανένα σύμβολο τερματισμού έτσι, η σύνδεση γίνεται δύσκολη όταν η μακροεντολή περιέχει περισσότερες από μία δηλώσεις.

Συμπεράσματα:

Οι λειτουργίες inline είναι πολύ πιο πειστικές από τη λειτουργία μακροεντολών. Το C ++ παρέχει επίσης έναν καλύτερο τρόπο για τον ορισμό μιας σταθεράς, η οποία χρησιμοποιεί μια λέξη-κλειδί "const".

Top