programing

글로벌 변수와 스태틱 변수가 기본값으로 초기화되는 이유는 무엇입니까?

itsource 2022. 7. 14. 20:35
반응형

글로벌 변수와 스태틱 변수가 기본값으로 초기화되는 이유는 무엇입니까?

C/C++에서는 글로벌 변수와 스태틱 변수가 기본값으로 초기화되는 이유는 무엇입니까?

그냥 쓰레기 값만 남겨두는 게 어때?특별한 이유라도 있나요?

  1. 보안: 메모리를 그대로 두면 다른 프로세스 또는 커널에서 정보가 유출될 수 있습니다.

  2. 효율성: 값은 초기화되기 전까지는 무용지물이며, 루프가 없는 블록에서 0으로 설정하는 것이 효율적입니다.OS 는, 일부의 클라이언트나 유저가 프로그램의 기동을 기다리고 있는 것이 아니고, 시스템이 아이돌 상태일 때에 프리리스트 페이지를 제로로 할 수도 있습니다.

  3. 재현성: 값을 그대로 두면 프로그램 동작을 반복할 수 없게 되어 버그를 찾는 것이 매우 어려워집니다.

  4. 우아함: 기본 이니셜라이저를 사용하여 코드를 복잡하게 만들지 않고 0부터 시작할 수 있는 프로그램이 더 깔끔합니다.

왜 이 말이 나오는지 수 있습니다.auto스토리지 클래스가 가비지로 시작됩니다.답은 두 가지입니다.

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

  2. 초기화와 관련된 2차(또는 기타) 런타임 성능 저하가 있을 수 있습니다.auto를 들어 또는 할 수 .함수는 예를 들어 어떤 콜에서도 대규모 어레이의 일부 또는 전부를 사용하지 않을 수 있으며 수천 번 또는 수백만 번 호출될 수 있습니다..static은 global 1회(OTOH)입니다.

OS의 적절한 협업을 통해 0의 초기화 스태틱과 글로벌을 런타임 오버헤드 없이 구현할 수 있기 때문입니다.

섹션 6.7.8 C99 표준(n1256)의 초기화는 다음과 같은 질문에 대답한다.

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

: 포인터 타입이 있으면 늘 포인터로 초기화됩니다.

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

집약일 경우 모든 구성원은 다음 규칙에 따라 (순차적으로) 초기화됩니다.

: 유니언일 경우 첫 번째 명명된 멤버는 다음 규칙에 따라 (순차적으로) 초기화됩니다.

정적 영역에서는 어떤 것이 실제로 초기화되었는지 또는 메인 시스템이 시작되었는지 항상 알 수 없습니다.스태틱 init 단계와 다이내믹 init 단계도 있습니다.순서가 중요한 다이내믹 단계 직후의 스태틱 단계입니다.

스태틱스를 제로화하지 않으면 이 단계에서는 어떤 것이 초기화되었는지 전혀 알 수 없습니다.단순히 말하면 C++ 월드가 분리되고 싱글톤(또는 다이내믹 스태틱 초기화) 등의 기본적인 것이 기능하지 않게 됩니다.

글머리 기호로 된 답변은 열정적이지만 약간 바보같다.이러한 모든 것이 비정적 할당에 적용될 수 있지만, 그렇지 않은 경우도 있습니다(경우에 따라 다르지만 보통은 그렇지 않습니다).

C에서는 명시적 이니셜라이저가 없는 스태틱하게 할당된 오브젝트는 제로(산술 타입의 경우) 또는 늘 포인터(포인터 타입의 경우)로 초기화됩니다.C의 실장은 일반적으로 제로값 비트로만 구성된 비트패턴을 사용하여 제로값과 늘포인터값을 나타냅니다(다만, 이것은 C 표준에서는 필수가 아닙니다).따라서 일반적으로 bss 섹션에는 파일 범위(즉, 함수 외부)에서 선언된 모든 초기화되지 않은 변수와 static 키워드로 선언된 초기화되지 않은 로컬 변수가 포함됩니다.

출처 : Wikipedia

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

반응형