IT TIP

전역 및 정적 변수가 기본값으로 초기화되는 이유는 무엇입니까?

itqueen 2020. 11. 30. 20:31
반응형

전역 및 정적 변수가 기본값으로 초기화되는 이유는 무엇입니까?


C / C ++에서 전역 변수와 정적 변수가 기본값으로 초기화되는 이유는 무엇입니까?

쓰레기 값만 남겨두면 어떨까요? 이에 대한 특별한 이유가 있습니까?


  1. 보안 : 메모리를 그대로두면 다른 프로세스 나 커널에서 정보가 유출됩니다.

  2. 효율성 : 값은 초기화 될 때까지 쓸모가 없으며, 풀린 루프가있는 블록에서 값을 0으로 만드는 것이 더 효율적입니다. OS는 일부 클라이언트 나 사용자가 프로그램이 시작되기를 기다리고있을 때가 아니라 시스템이 유휴 상태 일 때에도 프리리스트 페이지를 0으로 만들 수 있습니다.

  3. 재현성 : 값만 남겨두면 프로그램 동작을 반복 할 수 없게되어 버그를 찾기가 정말 어렵습니다.

  4. Elegance : 기본 이니셜 라이저로 코드를 복잡하게 만들지 않고도 프로그램이 0부터 시작할 수 있다면 더 깔끔합니다.

그러면 auto스토리지 클래스 쓰레기로 시작 하는지 궁금 할 것 입니다. 대답은 두 가지입니다.

  1. 어떤 의미 에서는 그렇지 않습니다 . 각 수준의 첫 번째 스택 프레임 페이지 (즉, 스택에 추가 된 모든 새 페이지)는 0 값을받습니다. 동일한 스택 수준의 후속 함수 인스턴스에서 볼 수있는 "가비지"또는 "초기화되지 않은"값은 실제로 자신의 프로그램 및 해당 라이브러리의 다른 메서드 인스턴스가 남긴 이전 값입니다.

  2. 초기화 (함수 로컬) 와 관련된 2 차 (또는 기타) 런타임 성능 불이익 이있을 수 있습니다 auto. 함수는 주어진 호출에서 큰 배열의 일부 또는 전부를 사용하지 않을 수 있으며 수천 또는 수백만 번 호출 될 수 있습니다. 정적 및 전역, OTOH의 초기화는 한 번만 발생하면됩니다.


OS의 적절한 협력으로 0 초기화 정적 및 전역을 런타임 오버 헤드없이 구현할 수 있기 때문입니다.


섹션 6.7.8 C99 표준 초기화 (n1256)가이 질문에 답합니다.

자동 저장 기간이있는 개체가 명시 적으로 초기화되지 않은 경우 해당 값은 확정되지 않습니다. 정적 저장 기간이있는 객체가 명시 적으로 초기화되지 않은 경우 :

— 포인터 유형이 있으면 널 포인터로 초기화됩니다.

— 산술 유형이 있으면 0으로 초기화됩니다 (양수 또는 부호 없음).

— 집계 인 경우 모든 멤버는 이러한 규칙에 따라 (재귀 적으로) 초기화됩니다.

— 공용체 인 경우 첫 번째 명명 된 멤버는 이러한 규칙에 따라 (재귀 적으로) 초기화됩니다.


그것에 대해 생각해보십시오. 정적 영역에서 무언가가 실제로 초기화되었는지 또는 그 메인이 시작되었는지 항상 알 수는 없습니다. 또한 정적 초기화 및 동적 초기화 단계가 있으며, 순서가 중요한 동적 초기화 바로 다음의 정적 단계입니다.

정적을 0으로 설정하지 않았다면이 단계에서 모든 것이 초기화되었는지 그리고 간단히 말해 C ++ 세계가 흩어지고 싱글 톤 (또는 모든 종류의 동적 정적 init)는 간단하게 작동하지 않습니다.

글 머리 기호에 대한 대답은 열광적이지만 약간 어리 석습니다. 그것들은 모두 비 정적 할당에 적용될 수 있지만 그렇게되지는 않습니다.


C에서 명시 적 이니셜 라이저없이 정적으로 할당 된 개체는 0 (산술 형식의 경우) 또는 널 포인터 (포인터 형식의 경우)로 초기화됩니다. C 구현은 일반적으로 0 값 비트로 만 구성된 비트 패턴을 사용하여 0 값과 널 포인터 값을 나타냅니다 (C 표준에서는 필요하지 않음). 따라서 bss 섹션에는 일반적으로 파일 범위 (즉, 함수 외부)에서 선언 된 모든 초기화되지 않은 변수와 static 키워드로 선언 된 초기화되지 않은 지역 변수가 포함됩니다.

출처 : Wikipedia

참고 URL : https://stackoverflow.com/questions/2091499/why-are-global-and-static-variables-initialized-to-their-default-values

반응형