Sobes.tech
Junior

Πότε και πόσο διαρκούν οι παγκόσμιες και τοπικές μεταβλητές σε C++;

sobes.tech AI

Απάντηση από AI

Παγκόσμιες μεταβλητές

  • Χρόνος ύπαρξης: Από την εκκίνηση του προγράμματος μέχρι το τερματισμό του.
  • Χώρος αποθήκευσης: Συνήθως στη στατική περιοχή μνήμης (.data ή .bss τμήματα του εκτελέσιμου αρχείου).
  • Αρχικοποίηση:
    • Οι μη στατικές παγκόσμιες μεταβλητές που ορίζονται σε επίπεδο αρχείου, με σύνθετους κατασκευαστές, αρχικοποιούνται πριν από την κλήση του main().
    • Οι παγκόσμιες μεταβλητές με μηδενική αρχικοποίηση (π.χ., int i = 0;) επίσης αρχικοποιούνται πριν από το main().
    • Οι μεταβλητές που ορίζονται με const ή έχουν στατικό χρόνο ζωής, αρχικοποιούνται κατά τη φόρτωση του προγράμματος.
  • Διαθεσιμότητα: Ορατές σε όλες τις συναρτήσεις εντός της περιοχής ορατότητας.

Τοπικές μεταβλητές

  • Χρόνος ύπαρξης: Από τον ορισμό της μεταβλητής εντός μπλοκ κώδικα (συνάρτηση, βρόχος, συνθήκη κ.λπ.) μέχρι την έξοδο από αυτό το μπλοκ.
  • Χώρος αποθήκευσης: Συνήθως στη στοίβα (για αυτόματες μεταβλητές). Οι στατικές τοπικές μεταβλητές αποθηκεύονται στη στατική περιοχή μνήμης.
  • Αρχικοποίηση:
    • Οι αυτόματες τοπικές μεταβλητές δεν αρχικοποιούνται από προεπιλογή (περιέχουν "σκουπίδια"). Απαιτούν ρητή αρχικοποίηση.
    • Οι στατικές τοπικές μεταβλητές αρχικοποιούνται μία φορά κατά την πρώτη προσέγγισή τους.
  • Διαθεσιμότητα: Ορατές μόνο εντός του μπλοκ κώδικα όπου ορίζονται.

Παραδείγματα

// Παγκόσμια μεταβλητή
int global_variable = 10;

void some_function() {
    // Τοπική μεταβλητή (αυτόματη)
    int local_variable_1; // Χωρίς αρχικοποίηση

    // Τοπική μεταβλητή (αυτόματη) με αρχικοποίηση
    int local_variable_2 = 20;

    // Στατική τοπική μεταβλητή
    static int static_local_variable = 30; // Αρχικοποιείται μία φορά

    // Πρόσβαση σε παγκόσμια μεταβλητή
    global_variable++;

    // Πρόσβαση σε τοπικές μεταβλητές
    local_variable_1 = global_variable;
    static_local_variable++;

    // Μετά την έξοδο από το some_function(), οι local_variable_1 και local_variable_2 παύουν να υπάρχουν
    // static_local_variable συνεχίζει να υπάρχει, διατηρώντας την τιμή του
}

int main() {
    some_function();
    some_function(); // static_local_variable διατήρησε την τιμή του
    // Η παγκόσμια μεταβλητή είναι διαθέσιμη εδώ
    // Οι local_variable_1 και local_variable_2 δεν είναι διαθέσιμες

    return 0;
}

Πίνακας σύγκρισης

Χαρακτηριστικό Παγκόσμιες μεταβλητές Τοπικές μεταβλητές (αυτόματες) Στατικές τοπικές μεταβλητές
Χρόνος ύπαρξης Από την εκκίνηση του προγράμματος μέχρι το τερματισμό Από τον ορισμό μέχρι την έξοδο από το μπλοκ κώδικα Από την πρώτη προσέγγιση μέχρι το τέλος του προγράμματος
Χώρος αποθήκευσης Στατική περιοχή μνήμης (.data, .bss) Στοίβα (stack) Στατική περιοχή μνήμης (.data, .bss)
Αρχικοποίηση Πριν από το main() ή κατά τη φόρτωση του προγράμματος Δεν αρχικοποιούνται από προεπιλογή. Απαιτείται ρητή αρχικοποίηση Μία φορά κατά την πρώτη προσέγγιση, κατά την ορισμό
Διαθεσιμότητα Ορατές παντού στον χώρο ορατότητας του αρχείου Μόνο εντός του μπλοκ κώδικα Μόνο εντός του μπλοκ κώδικα