타입 안전성을 깨고 실제 가비지 콜렉션이 언어에 추가되는 것을 금지하는 C 프로그래밍 언어의 특징은 무엇입니까? 설명. 첫째, 유형 안전과 가비지 수집 사이의 관계를 이해하지 못합니다. 누군가가 저를 도울 수 있으면 고맙겠습니다.타입 안전성과 가비지 콜렉션의 실용성 사이의 관계
답변
너 캔conservative garbage collection이라고하는 가비지 콜렉션. 트릭은 포인터처럼 보이는 모든 데이터를 실제로 포인터 인 것처럼 취급하고이를 통해 도달 할 수있는 메모리를 회수하지 않는 것입니다. 두 가지 문제가 있습니다. 첫째, 포인터처럼 보이는 것이 실제로 포인터인지 여부에 대한 불확실성 때문에 데이터를 이동할 수 없습니다 (예 : 압축). 따라서 새 위치를 가리 키도록 업데이트하면 데이터가 손상 될 수 있습니다).
타입 안전성 문제는 C 프로그래머가 int에 대한 포인터를 저장하고 수학을 수행 한 다음 포인터를 복원하는 것이 가능하다는 것입니다 (예 : ptrdiff_t d = (ptrdiff_t) ptr; ptr = NULL; d += 42; /* GC here would be bad */ d -= 42;
).이 포인터 숨김은 보수적 인 쓰레기 수집기를 사용하여 해당 포인터를 통해서만 도달 할 수있는 메모리를 조기에 회수 할 수 있습니다.
자세한 답변 해 주셔서 감사합니다. 첫째, 타입 캐스팅을 기억하지 못했기 때문에 나에게는 명확하지 않았습니다. – Moonwild
실제로 상황은 더욱 심각합니다. 100 % 합법적 인 C 프로그램은 큰 메모리 덩어리를 반복적으로 할당하고 채우고,'unsigned char [sizeof (void *)] '와 함께 유니온에 포인터를 저장하고 그 배열의 내용을 (아마 16 진수로) 출력 할 수 있습니다. 콘솔을 열고 해당 포인터의 모든 추적을 덮어 씁니다. 그런 다음 여러 번 수행 한 후 16 진수 시퀀스를 수락하고 위에서 언급 한 합집합을 사용하여 포인터를 다시 포인터로 변환하고 식별 된 메모리의 내용을 표시 할 수 있습니다. C 표준은 포인터가 유효 할 때까지 유효하다는 것을 요구하기 때문에 ... – supercat
... 기본'char []'를 재구성하기에 충분한 데이터는 * 아무 데나 * 저장되며 컴퓨터 * 내부에 * 필요하지도 않습니다. 많은 경우에 C 구현체가 어떤 특정 포인터가 여전히 존재 하는지를 결정하는 것이 불가능할 것입니다. (그것은'unsigned char'으로 앨리어싱 된 적이없는 포인터에 대해 그러한 결정을 내릴 수 있습니다. 그러나 이것은 포인터가 존재하지 않는 포인터에 대해서 GC를 배제 할 것입니다. 이제까지 memcpy에 노출되었다.). – supercat
유형 안전과 가비지 수집 간에는 아무런 관련이 없습니다. 예를 들어, 매우 안전하지만 요즘 가비지 컬렉터는 사용하지 않는 Ada라는 언어가 있습니다. 동시에 자바 스크립트는 동적 언어 (즉, 유형 안전성이 없음)이지만 대부분의 구현에서 가비지 수집기가 있습니다.
- 1. 가비지 콜렉션의 문제점
- 2. Hibernate 콜렉션의 복수형 타입
- 3. 효율성과 실용성 사이의 경계를 그리는 곳
- 4. 두 컨트롤러 사이의 관계
- 5. 컨트롤러와 뷰 사이의 관계
- 6. UIViewController와 UIView 사이의 관계
- 7. 두 Datacontext 사이의 관계
- 8. BlogEngine xml 형식의 실용성
- 9. 스칼라와 C++ 형질 사이의 관계
- 10. STL에서 반복자와 컨테이너 사이의 관계
- 11. layout()과 onLayout() 사이의 관계
- 12. 서페이스와 캔버스 사이의 관계 : Android
- 13. Javascript에 다른 언어를 컴파일하는 실용성?
- 14. Java NIO : OP_ACCEPT와 OP_READ 사이의 관계?
- 15. html의 두 선택 태그 사이의 관계
- 16. 범위와 일부 상수 사이의 사적 관계?
- 17. 데이터베이스 이론 - 두 테이블 사이의 관계
- 18. 정수 관계 구현 (실수 사이의 비율 찾기)
- 19. Linq 매핑 문제가 1에서 0.1 사이의 관계
- 20. .NET Framework의 어셈블리와 네임 스페이스 사이의 관계?
- 21. CRITICAL_SECTION과 CCriticalSection 사이의 관계 선박은 무엇입니까
- 22. 일반 컬렉션을 사용하여 안전성과 성능을 개선해야합니까?
- 23. 아파치 콜렉션의 트랜스포머
- 24. verity 콜렉션의 파일 이동
- 25. Javascript 가비지 컬렉션 일시 중지
- 26. 콜렉션의 키 및 값 사용
- 27. MongoDB 정렬은 콜렉션의 섹션에서만 작동합니다.
- 28. 플렉스에서 배열과 배열 콜렉션의 차이점
- 29. 콜렉션의 이벤트 핸들러간에 데이터 전달
- 30. 멀티 세트에서 콜렉션의 발생을 제거
가비지 컬렉터는 객체에 대한 포인터와 방금 동일한 값을 보유하는 임의의 메모리 비트 사이의 차이를 어떻게 알 수 있습니까? –
이것이 바로 포인트입니다! 그래서 해결책은 보수적 인 컬렉션을 사용하는 것입니다! – Moonwild