글로벌 변수와 스태틱 변수가 기본값으로 초기화되는 이유는 무엇입니까?
C/C++에서는 글로벌 변수와 스태틱 변수가 기본값으로 초기화되는 이유는 무엇입니까?
그냥 쓰레기 값만 남겨두는 게 어때?특별한 이유라도 있나요?
보안: 메모리를 그대로 두면 다른 프로세스 또는 커널에서 정보가 유출될 수 있습니다.
효율성: 값은 초기화되기 전까지는 무용지물이며, 루프가 없는 블록에서 0으로 설정하는 것이 효율적입니다.OS 는, 일부의 클라이언트나 유저가 프로그램의 기동을 기다리고 있는 것이 아니고, 시스템이 아이돌 상태일 때에 프리리스트 페이지를 제로로 할 수도 있습니다.
재현성: 값을 그대로 두면 프로그램 동작을 반복할 수 없게 되어 버그를 찾는 것이 매우 어려워집니다.
우아함: 기본 이니셜라이저를 사용하여 코드를 복잡하게 만들지 않고 0부터 시작할 수 있는 프로그램이 더 깔끔합니다.
왜 이 말이 나오는지 수 있습니다.auto
스토리지 클래스가 가비지로 시작됩니다.답은 두 가지입니다.
어떤 의미에서는 그렇지 않다.각 레벨의 첫 번째 스택프레임 페이지(즉, 스택에 추가된 모든 새로운 페이지)는 제로 값을 받습니다.같은 스택레벨의 후속 함수인스턴스에서 볼 수 있는 "쓰레기" 또는 "초기화되지 않은" 값은 실제로 자신의 프로그램 및 라이브러리의 다른 메서드인스턴스에 의해 남겨진 이전 값입니다.
초기화와 관련된 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
'programing' 카테고리의 다른 글
Vue SPA - 사용자가 인증되었는지 확인하고 인증되지 않은 경우 로그인으로 수정합니다. (0) | 2022.07.14 |
---|---|
warning: 문자열 리터럴이 아닌 형식 인수 및 no format 인수 (0) | 2022.07.14 |
VUE 감시가 무한 루프를 트리거했습니다. (0) | 2022.07.05 |
C에서 int를 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2022.07.05 |
동적 할당 없이 실행 시 어레이 크기가 허용됩니까? (0) | 2022.07.05 |