아주 원시적으로 생각해봤는데
D램의 반도체칩내에서 데이터 저장은 결국 축전기소자 배열의 on/off상태로 결정되는거잖아
쓰레기값이라는건 어쨌든 0으로 들어찬건 아니란건데 (우연히 0일수도있겠지만)
그렇단얘긴 D램의 리프레시과정에서 흐르는 전자들이 초기화되지 않은 변수주소에 그냥 '묻었다'라고 생각하면 되는건가?
아주 원시적으로 생각해봤는데
D램의 반도체칩내에서 데이터 저장은 결국 축전기소자 배열의 on/off상태로 결정되는거잖아
쓰레기값이라는건 어쨌든 0으로 들어찬건 아니란건데 (우연히 0일수도있겠지만)
그렇단얘긴 D램의 리프레시과정에서 흐르는 전자들이 초기화되지 않은 변수주소에 그냥 '묻었다'라고 생각하면 되는건가?
쓰레기 값이 아니라 원래부터 있었을 뿐!!
오오..! 그렇구나 뇌리가 번뜩!!
이럴 수도 있고 저럴 수도 있습니다. 자세한 것은 읽어보시면 알 수 있습니다.
반도체 소자까지 이야기가 들어갈 필요는 없고 어셈블리 수준에서 이해 가능한 부분임. 먼저 프로그램을 디버깅 모드로 컴파일할 때와 릴리즈 모드로 컴파일할 때가 다른데, 디버그 모드로 컴파일할 경우 지역 변수의 값은 0xCC 바이트로 채워진 상태로 초기화된다. 다시 말해 초기값이 없는 int형 변수는 컴파일러가 자동으로 0xCC로 채워준다는 거지. 이렇게 하는 이유는 버그 발견을 위함인데, 0xCC는 인텔 기계어 명령어로 INT3(브레이크 포인트 인터럽트)에 해당하는 명령어야.
릴리즈 모드로 컴파일할 경우 지역 변수는 그저 스택 메모리에 남아있던 값이 그대로 쓰레기로 들어와 있을 뿐이야. 자료 구조 배웠으면 스택의 PUSH/POP 개념을 알텐데, 지역 변수 메모리 역시 함수에 들어올 때마다 PUSH되어서 공간이 마련되고 빠져나올 때 POP되어서 공간이 반환되는데 반환할 때 메모리 값을 0으로 채우는 것도 CPU time을 소모하는 일이라 그냥 포인터만 옮겨서 논리적으로만 없는 것으로 만들고 메모리를 덮어씌우진 않는다.