Ilias95 Δημοσ. 21 Σεπτεμβρίου 2017 Δημοσ. 21 Σεπτεμβρίου 2017 Καλησπέρα,Στον παρακάτω κώδικα: #include <stdio.h> int main(void) { int i = 1, x = 2; { int i = 5; printf("i: %d, x: %d\n", i, x); } printf("i: %d, x: %d\n", i, x); return 0; } Η πρώτη δήλωση του i θα αποθηκευτεί στο stack frame της main (ακριβώς κάτω απ' τον αποθηκευμένο EBP). Η δεύτερη δήλωση του i μέσα στο compound statement πού ακριβώς θα αποθηκευτεί ώστε να είναι προσβάσιμο μόνο μέσα σε εκείνο το block και όχι σε ολόκληρη τη main;Και όταν κάνω αναφορές σε μεταβλητές μέσα σε ένα compound statement πώς ξεχωρίζει ο compiler αν πρόκειται για τοπικές μεταβλητές που ανήκουν στο συγκεκριμένο block ή σε κάποιο εξωτερικό block;Ευχαριστώ.
GReaperEx Δημοσ. 21 Σεπτεμβρίου 2017 Δημοσ. 21 Σεπτεμβρίου 2017 Το stack frame χωρίζεται από τον compiler αυτόματα. Συνήθως η δημιουργία των τοπικών μεταβλητών γίνεται στην αρχή, απλά με μια ανάθεση και μια πρόσθεση, ανεξαρτήτως του scope. Το πώς το ξεχωρίζει ο compiler εξαρτάται από την υλοποίηση του. Μπορώ να υποθέσω ότι στο "μυαλό" του compiler, οι μεταβλητές έχουν πολλαπλά χαρακτηριστικά, κ ένα από αυτά είναι το scope στο οποίο δηλώθηκαν. Έτσι θα μπορεί να ξεχωρίσει δύο μεταβλητές με το ίδιο όνομα. 1
vel0city Δημοσ. 21 Σεπτεμβρίου 2017 Δημοσ. 21 Σεπτεμβρίου 2017 Δες μόνος σου!https://godbolt.org/g/GPfxkR Αριστερά είναι ο κώδικας σε C, δεξιά η assembly που βγαζει o GCC (μπορεις να δοκιμασεις και αλλους compilers) (δες δεξια τις γραμμες 7-9) Προφανώς αυτό ισχύει μόνο για debug builds, κανονικά θα έλεγες στον compiler να κανει optimize οτι μπορεί: https://godbolt.org/g/tRXoP4 Όπως βλέπεις το αποτέλεσμα είναι πολύ διαφορετικό, δεν χρησιμοποιείται καν το rbp και γενικά το stack για αποθήκευση των μεταβλητών. 1
Ilias95 Δημοσ. 21 Σεπτεμβρίου 2017 Μέλος Δημοσ. 21 Σεπτεμβρίου 2017 Τέλεια, άρα τοποθετείται ακριβώς κάτω από το x, σαν να είναι δηλωμένο κατευθείαν στο κύριο block της main. Παρατήρησα ότι αν δηλώσω και μια τρίτη μεταβλητή με auto storage duration κάτω απ' το block (σε C99) θα γίνει pushed ακριβώς από κάτω.Δηλαδή: int a; { int b; } int c; Στο stack θα είναι έτσι: |-----| | a | |-----| | b | |-----| | c | |-----| Άρα μετά ότι έχει να κάνει με scoping rules το αναλαμβάνει ο compiler.@vel0city Τέλειο το link btw!Ευχαριστώ για τις απαντήσεις! 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα