Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

Στον παρακάτω κώδικα:
 

#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;

Ευχαριστώ.

Δημοσ.

Το stack frame χωρίζεται από τον compiler αυτόματα. Συνήθως η δημιουργία των τοπικών μεταβλητών γίνεται στην αρχή, απλά με μια ανάθεση και μια πρόσθεση, ανεξαρτήτως του scope.

 

Το πώς το ξεχωρίζει ο compiler εξαρτάται από την υλοποίηση του. Μπορώ να υποθέσω ότι στο "μυαλό" του compiler, οι μεταβλητές έχουν πολλαπλά χαρακτηριστικά, κ ένα από αυτά είναι το scope στο οποίο δηλώθηκαν. Έτσι θα μπορεί να ξεχωρίσει δύο μεταβλητές με το ίδιο όνομα.

  • Like 1
Δημοσ.

Δες μόνος σου!
https://godbolt.org/g/GPfxkR

 

Αριστερά είναι ο κώδικας σε C, δεξιά η assembly που βγαζει o GCC (μπορεις να δοκιμασεις και αλλους compilers)

(δες δεξια τις γραμμες 7-9)

 

Προφανώς αυτό ισχύει μόνο για debug builds, κανονικά θα έλεγες στον compiler να κανει optimize οτι μπορεί:

https://godbolt.org/g/tRXoP4

 

Όπως βλέπεις το αποτέλεσμα είναι πολύ διαφορετικό, δεν χρησιμοποιείται καν το rbp και γενικά το stack για αποθήκευση των μεταβλητών.

  • Like 1
Δημοσ.

Τέλεια, άρα τοποθετείται ακριβώς κάτω από το 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!

Ευχαριστώ για τις απαντήσεις!

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...