2013-02-20 17 views
10

W języku C i C++, na czym polega korzyść polegająca na utworzeniu lokalnej zmiennej o wartości ? Zakładając, że inicjalizacja nie używa innych zmiennych, czy istnieje jakaś różnica między zachowaniem wartości między połączeniami i ustawieniem tej samej stałej wartości dla każdego połączenia?C/C++ Cel zmiennej lokalnej zmiennej stałej

Czy prawidłowy kompilator języka C może zignorować numer static?

W języku C++ unika konstrukcji/zniszczenia między połączeniami, ale czy może istnieć jakakolwiek inna korzyść?

+1

W przeciwieństwie do tego, co - do "const", do "static", czy do żadnych modyfikatorów? – MathSquared

+0

Właśnie zredagowałem pytanie. Zakładając, że var jest w rzeczywistości const. – yukon

+2

Być może znajdziesz tu to, czego potrzebujesz: http://stackoverflow.com/questions/3709207/c-semantics-of-static-const-vs-const – Carl

Odpowiedz

6

Nie bierze się stosu przestrzeń może być korzyść, jeśli masz coś takiego:

static const double table[fairly_large_number] = { .... }; 

Oczywiście, koszt budowy może być również na tyle, że jeśli funkcja nazywana jest dużo, jest znaczna dobra wartość tylko w przypadku konstruowania obiektu raz.

+0

Twoja uwaga o zajmowaniu miejsca na stosie ma sens, dopóki nie zorientujesz się, że musi zostać zainicjowany, ponieważ jest to 'const'. Wszystko, co chcesz umieścić w pliku źródłowym jako stałe, może łatwo zmieścić się na stosie. –

+0

Hmm, to pomocne. Kolejne małe pytanie, czy zmienna zmienna jest prawdopodobnie zarejestrowana? – yukon

+0

@MarkRansom: a) zależny od wielkości stosu, b) ile mam różnych rzeczy. I cokolwiek robię, lista inicjalizatorów będzie częścią mojego kodu, tak czy inaczej. Jeśli to, powiedzmy, wygenerowana maszynowo tabela stałych dla czcionki Times Roman, którą chcę zakodować na sztywno w moim edytorze tekstu, to nie byłoby dobrze umieścić na stosie, nawet jeśli stos jest w miarę duże. Właściwie napisałem kod, który zawiera tabele LARGE, ponieważ ma to więcej sensu niż posiadanie kodu w programie do budowania tabel. –

2

Tak, i jest ogromny: korzyść semantyczna semantyczna.

Po wstawieniu const nie oznacza to, że kompilator nie powinien pozwolić na modyfikację zmiennej. Wydajesz odważniejsze oświadczenie każdemu, kto czyta kod później: to się nigdy nie zmieni. Nawet przez efekt uboczny, w którym podajesz tę zmienną jako wskaźnik do innej funkcji.

Ponadto, kompilator może wykorzystać te nowe informacje i zoptymalizować je w niektórych sytuacjach, w zależności od konkretnego typu, z którym mamy do czynienia.

(być jasne, mówię tutaj o const vs. non-const, nie static vs. non-static.)

Edit: This SO answer jest bardzo pouczające też.

Powiązane problemy