2015-12-20 41 views
11

Chcę zapytać, w jaki sposób zmienne C są przechowywane w C?Jak jest przechowywana nazwa zmiennej w C?

Aby być bardziej jasne rozważyć następujący kod:

int main() { 
    int a = 1, b; 
    b = a + 2; 
    return 0; 
} 

Na przykład tutaj, w jakich pamięć przechowuje C nazwami zmiennych miejscach.

np. Jeśli &a=0x12A7 (załóżmy) &b=0x123B1, to w jaki sposób i gdzie przechowuje nazwy zmiennych, takie jak w których przechowywana jest nazwa pamięci a?

Odpowiedz

12

C nie zapisuje nazwy zmiennych. Jest to kompilator przechowujący nazwy zmiennych w tabeli symboli kompilatora.
Ta struktura danych jest tworzona i obsługiwana przez kompilator.
example z tablicy symboli dla fragmencie

// Declare an external function 
extern double bar(double x); 

// Define a public function 
double foo(int count) 
{ 
    double sum = 0.0; 

    // Sum all the values bar(1) to bar(count) 
    for (int i = 1; i <= count; i++) 
     sum += bar((double) i); 
    return sum; 
} 

może zawierać co najmniej następujące symbol:

enter image description here

+3

Tablica symboli jest konstrukcją kompilacji, nie odzwierciedla właściwości środowiska wykonawczego. Pliki map i informacje o debugowaniu są źródłami dostępnymi, aby uzyskać wyobrażenie o nazwach symboli dla lokalizacji, ale nie miały one być używane z programu .. RTTI i inne formy introspekcji są, ale C nie ma żadnej formy tego –

18

Nazwy zmiennych nie muszą być w ogóle zapisywane! Kompilator może się ich całkowicie pozbyć. Wyobraź sobie, jeśli kompilator jest dość sprytny, może to zmniejszyć całego programu to:

int main(){ 
    return 0; 
} 

Należy pamiętać, że efekt tego programu jest dokładnie taka sama jak oryginału, a teraz nie ma zmienne w ogóle! Nie ma potrzeby nazywania ich teraz, prawda?

Nawet jeśli zmienne w kodzie były rzeczywiście używane, ich nazwy są czysto wygodnym zapisem podczas pisania programu, ale nie są potrzebne procesorowi podczas wykonywania kodu. Jeśli chodzi o mikroprocesor jest zaniepokojony, funkcję tak:

int foo(int x, int y) { 
    int z = x + y; 
    return z * 2; 
} 

może spowodować skompilowanego kodu, który robi to w jakimś hipotetycznym prostego zestawu instrukcji architektury (ISA):

ADD # consumes top two values on stack (x and y), pushes result (z) 
PUSH 2 # pushes 2 on stack 
MULT # consumes top two values on stack (z and 2), pushes result 
RET 

Im dłuższa historia jest to, że nazwy zmiennych są czasami zapisywane do celów debugowania. Na przykład, jeśli używasz GCC, możesz przekazać opcję -g, aby emitować "tabelę symboli", która zawiera takie nazwy zmiennych, jak debugowanie. Ale nie jest potrzebne po prostu do uruchomienia programu i nie jest objęty standardem językowym - jest to funkcja implementacji, która różni się w zależności od platformy.

+0

ok Mam pewien pomysł –

-1

Ok Po pierwsze, jeśli dopiero zaczyna swój głowę na cieśninę z C to jest gdzie zacząć: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml

Ale to jest bardziej praktyczne niż twoje pytanie. Aby odpowiedzieć, najpierw pytamy, dlaczego zmienne mają adresy. Dlaczego tutaj jest stos. Aby program zadziałał, połączenia zwrotne muszą być kierowane do odpowiedniego bufora, aby wszystkie elementy pasowały do ​​siebie zgodnie z projektem. Teraz to, co uważam za pierwotne pytanie, to w jaki sposób decyduje się na rzeczywisty adres, ponieważ odpowiedź na to pytanie wymaga zrozumienia, w jaki sposób procesor wdraża stertę.

https://en.wikipedia.org/wiki/Memory_management

„Ponieważ dokładna lokalizacja alokacji nie jest znana z góry, pamięć jest dostępna pośrednio, zazwyczaj poprzez odniesienie wskaźnika. Szczególną algorytm używany do organizowania obszar pamięci i przydzielić i zwalnianie kawałki jest powiązane z jądrem ...”

co prowadzi nas z powrotem do strony praktycznej rzeczy z abstrakcji do wskaźników:

https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

Hope tis daje trochę bardziej przejrzysty obraz tego, co znajduje się pod maską:)

Happy codding.