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() ή κατά τη φόρτωση του προγράμματος |
Δεν αρχικοποιούνται από προεπιλογή. Απαιτείται ρητή αρχικοποίηση | Μία φορά κατά την πρώτη προσέγγιση, κατά την ορισμό |
| Διαθεσιμότητα | Ορατές παντού στον χώρο ορατότητας του αρχείου | Μόνο εντός του μπλοκ κώδικα | Μόνο εντός του μπλοκ κώδικα |