2011-08-22 13 views
7

W komentarzu do tego answer na the usage of Anonymous enum, Oli Charlesworth stwierdza:const int nie zajmuje miejsca?

const int jest niezmienny i nie może zająć żadnego miejsca, w zależności od co kompilator zdecyduje się zrobić.

Jeśli oświadczam const int i = 10, jak jest zapisane, że 10 jeśli „nie może zająć żadnego miejsca”?

Zakładając, że int ma 4 bajty, zakładam, że co najmniej 4 bajty są zarezerwowane do przechowywania 10 jako const int.

+3

Zajmuje miejsce bez względu na wszystko.Pytanie gdzie jest. –

Odpowiedz

9

Kompilator może zoptymalizować kod według własnego uznania, o ile wynikowy kod oferuje te same obserwowalne efekty uboczne.

W związku z tym zmienne można zoptymalizować tak, aby istniały tylko w rejestrach lub zastępowane bezpośrednimi wartościami. W pseudo-maszyna-Code:

SET 10, eax 
ST eax, &i # Initialise i 

... 

LD &i, eax # Add i to ebx 
ADD eax, ebx, ebx 

może stać:

SET 10, eax 
ADD eax, ebx, ebx 

lub nawet tylko:

ADD 10, ebx, ebx 
+0

Nadal nie widzę, jak możesz to sprawdzić. Czy istnieją jakiekolwiek kompilacje dokumentacji, które określają tego rodzaju optymalizacje. Jeśli nie, chcę wiedzieć, jak to jest, że wiesz, że kompilatory są świadome takich optymalizacji. Z góry dziękuję. – atoMerz

+0

@AtoMerZ: Jednym ze sposobów jest po prostu spojrzenie na dane wyjściowe kompilatora (uruchom 'objdump' lub coś w pliku obiektowym lub pliku wykonywalnym). Kolejny jest do odczytu Wikipedia: http://en.wikipedia.org/wiki/Constant_folding. –

+0

Jeszcze raz dziękuję, link pomógł. – atoMerz

2

Może to być część kodu i może być używana jako stała wartość (na przykład #define FIVE 5).

3

Kompilator może zastąpić numer 10 za każdym razem to musi przeczytać i, zamiast czytania zapisana wartość.

5

Jeśli nie używasz i w sposób wymagający adresu, kompilator zwykle użyje go po prostu w czasie kompilacji, aw czasie wykonywania pozostanie bez niego jako 10, a nie jako zmienna.

W szczególności, ponieważ const nie zmienia się, nie ma potrzeby, aby faktycznie przechowywać go w pamięci, chyba że zrobisz coś takiego jak przekazanie go do funkcji, która pobiera parametr przez odniesienie.

2

Kompilator może po prostu zastąpić wszystkie wystąpienia i w kodzie przez stałą 10. Nie i więcej, stąd nie ma wymagań dotyczących miejsca, kosztuje to samo (jeśli kompilator nie jest zwykły głupi lub widzi, że odrzucasz const) jak używanie magicznych liczb, po prostu tworzy znacznie bardziej czytelny kod. Przy małych stałych może być w stanie złożyć je w instrukcje montażu.

3

Cóż, to trochę mylące powiedzieć, że zajmie przestrzeń no, ponieważ wartość oczywiście pozostanie w pamięci instrukcji w pamięci, ale nie zostanie przypisana żadna spacja do przechowywania zmiennej jako typu danych w pytaniu. Bardziej właściwe byłoby stwierdzenie, że możliwa jest minimalna ilość pamięci, na którą, moim zdaniem, wskazuje twoja reakcja.

0

Najprawdopodobniej zajmie miejsce, jeśli zadeklarujesz je w globalnej przestrzeni nazw. Jeśli zadeklarujesz go w ciele funkcji lub zadeklarujesz gdzieś 'statyczny', kompilator może go usunąć. Jeśli deklarujesz to globalnie, kompilator nie ma możliwości sprawdzenia, czy stała jest odwoływana z innej jednostki tłumaczeniowej.

Powiązane problemy