2011-01-11 6 views
2

타입 안전성을 깨고 실제 가비지 콜렉션이 언어에 추가되는 것을 금지하는 C 프로그래밍 언어의 특징은 무엇입니까? 설명. 첫째, 유형 안전과 가비지 수집 사이의 관계를 이해하지 못합니다. 누군가가 저를 도울 수 있으면 고맙겠습니다.타입 안전성과 가비지 콜렉션의 실용성 사이의 관계

+0

가비지 컬렉터는 객체에 대한 포인터와 방금 동일한 값을 보유하는 임의의 메모리 비트 사이의 차이를 어떻게 알 수 있습니까? –

+0

이것이 바로 포인트입니다! 그래서 해결책은 보수적 인 컬렉션을 사용하는 것입니다! – Moonwild

답변

1

conservative garbage collection이라고하는 가비지 콜렉션. 트릭은 포인터처럼 보이는 모든 데이터를 실제로 포인터 인 것처럼 취급하고이를 통해 도달 할 수있는 메모리를 회수하지 않는 것입니다. 두 가지 문제가 있습니다. 첫째, 포인터처럼 보이는 것이 실제로 포인터인지 여부에 대한 불확실성 때문에 데이터를 이동할 수 없습니다 (예 : 압축). 따라서 새 위치를 가리 키도록 업데이트하면 데이터가 손상 될 수 있습니다).

타입 안전성 문제는 C 프로그래머가 int에 대한 포인터를 저장하고 수학을 수행 한 다음 포인터를 복원하는 것이 가능하다는 것입니다 (예 : ptrdiff_t d = (ptrdiff_t) ptr; ptr = NULL; d += 42; /* GC here would be bad */ d -= 42;).이 포인터 숨김은 보수적 인 쓰레기 수집기를 사용하여 해당 포인터를 통해서만 도달 할 수있는 메모리를 조기에 회수 할 수 있습니다.

+0

자세한 답변 해 주셔서 감사합니다. 첫째, 타입 캐스팅을 기억하지 못했기 때문에 나에게는 명확하지 않았습니다. – Moonwild

+0

실제로 상황은 더욱 심각합니다. 100 % 합법적 인 C 프로그램은 큰 메모리 덩어리를 반복적으로 할당하고 채우고,'unsigned char [sizeof (void *)] '와 함께 유니온에 포인터를 저장하고 그 배열의 내용을 (아마 16 진수로) 출력 할 수 있습니다. 콘솔을 열고 해당 포인터의 모든 추적을 덮어 씁니다. 그런 다음 여러 번 수행 한 후 16 진수 시퀀스를 수락하고 위에서 언급 한 합집합을 사용하여 포인터를 다시 포인터로 변환하고 식별 된 메모리의 내용을 표시 할 수 있습니다. C 표준은 포인터가 유효 할 때까지 유효하다는 것을 요구하기 때문에 ... – supercat

+0

... 기본'char []'를 재구성하기에 충분한 데이터는 * 아무 데나 * 저장되며 컴퓨터 * 내부에 * 필요하지도 않습니다. 많은 경우에 C 구현체가 어떤 특정 포인터가 여전히 존재 하는지를 결정하는 것이 불가능할 것입니다. (그것은'unsigned char'으로 앨리어싱 된 적이없는 포인터에 대해 그러한 결정을 내릴 수 있습니다. 그러나 이것은 포인터가 존재하지 않는 포인터에 대해서 GC를 배제 할 것입니다. 이제까지 memcpy에 노출되었다.). – supercat

-1

유형 안전과 가비지 수집 간에는 아무런 관련이 없습니다. 예를 들어, 매우 안전하지만 요즘 가비지 컬렉터는 사용하지 않는 Ada라는 언어가 있습니다. 동시에 자바 스크립트는 동적 언어 (즉, 유형 안전성이 없음)이지만 대부분의 구현에서 가비지 수집기가 있습니다.

관련 문제