Dlaczego zmienne globalne i statyczne są inicjowane do wartości domyślnych?

W C/c++, dlaczego zmienne globalne i statyczne są inicjowane na wartości domyślne?

Dlaczego nie zostawić go tylko wartości śmieci? Czy są jakieś specjalne dlaczego?

Author: Peter Mortensen, 2010-01-19

5 answers

  1. Bezpieczeństwo: pozostawienie samej pamięci spowodowałoby wyciek informacji z innych procesów lub jądra.

  2. efektywność: wartości są bezużyteczne, dopóki nie zostaną zainicjowane na coś, a bardziej efektywne jest zerowanie ich w bloku z rozwiniętymi pętlami. System Operacyjny może nawet zerować strony freelista, gdy system jest bezczynny, a nie gdy jakiś klient lub użytkownik czeka na program zaczynaj.

  3. odtwarzalność: pozostawienie samych wartości sprawiłoby, że zachowanie programu nie byłoby powtarzalne, przez co błędy byłyby naprawdę trudne do znalezienia.

  4. elegancja: jest czystsze, jeśli programy mogą zaczynać się od 0 bez konieczności zaśmiecania kodu domyślnymi inicjalizatorami.

Można by się zastanawiać, dlaczego klasa auto storage class zaczyna się jako śmieci. Odpowiedź jest Dwukrotna:

  1. Nie, w pewnym sensie. Pierwsza strona ramki stosu na każdym poziomie (tzn. każda nowa Strona dodana do stosu) otrzymuje zero wartości. Wartości "śmieci" lub "niezainicjalizowane", które kolejne instancje funkcji na tym samym poziomie stosu są tak naprawdę poprzednimi wartościami pozostawionymi przez inne instancje metody Twojego programu i jego biblioteki.

  2. Może istnieć kwadratowy (lub cokolwiek) runtime performance związany z inicjalizacją auto (funkcja) do czegokolwiek. A funkcja może nie używać żadnej lub wszystkich dużej tablicy, powiedzmy, w dowolnym wywołaniu i może być wywoływana tysiące lub miliony razy. Inicjalizacja statyki i globali, OTOH, musi nastąpić tylko raz.

 65
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 17:54:08

Ponieważ przy prawidłowej współpracy systemu operacyjnego można zaimplementować 0 inicjalizujących statykę i globale bez zbędnego nakładu czasu pracy.

 23
Author: R Samuel Klatchko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 06:31:06

Sekcja 6.7.8 Inicjalizacja standardu C99 (n1256) odpowiada na to pytanie:

Jeśli obiekt z automatycznym czasem przechowywania nie jest jawnie zainicjowany, jego wartość jest nieokreślona. Jeśli obiekt o statycznym czasie przechowywania nie jest jawnie zainicjowany, to:

- jeśli ma typ wskaźnika, to jest inicjalizowany na wskaźnik null;

- jeśli ma typ arytmetyczny, jest inicjalizowany na (dodatnie lub niepodpisane) zero;

- jeśli jest zbiorem, każdy członek jest inicjalizowana (rekurencyjnie) zgodnie z tymi regułami;

- jeśli jest to związek, pierwszy nazwany członek jest inicjowany (rekurencyjnie) zgodnie z tymi regułami.

 17
Author: Jingguo Yao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-04 03:45:35

Pomyśl o tym, w sferze statycznej nie zawsze można stwierdzić, że coś jest rzeczywiście zainicjowane, lub że main się rozpoczął. Jest też statyczna INIT i dynamiczna Faza init, statyczna pierwsza zaraz po dynamicznej, gdzie liczy się porządek.

Gdybyś nie miał zerowania statyki to byś zupełnie nie był w stanie stwierdzić w tej fazie na pewno czy coś w ogóle zostało zainicjowane i krótko mówiąc świat C++ by się rozleciał i podstawowe rzeczy takie jak singletony (lub jakiekolwiek rodzaj dynamicznego statycznego init) po prostu przestanie działać.

Odpowiedź z bulletpoints jest entuzjastyczna, ale trochę głupia. Wszystkie te mogą dotyczyć alokacji niestatycznej, ale nie jest to zrobione (dobrze, czasami, ale nie Zwykle).

 6
Author: Charles Eli Cheese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 12:08:59

W C, statycznie przydzielane obiekty bez jawnego inicjalizatora są inicjalizowane na zero (dla typów arytmetycznych) lub wskaźnik null (dla typów wskaźników). Implementacje C zazwyczaj reprezentują wartości zerowe i wartości wskaźnika null przy użyciu wzorca bitowego składającego się wyłącznie z bitów o wartości zerowej (choć nie jest to wymagane przez standard C). dlatego sekcja bss zazwyczaj zawiera wszystkie niezainicjalizowane zmienne zadeklarowane w zakresie pliku (tj. poza dowolną funkcją), a także niezainicjalizowane zmienne lokalne zadeklarowane za pomocą słowa kluczowego static.

Źródło: Wikipedia

 2
Author: Anant Simran Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-21 13:36:59