인터뷰 질문: 스택 및 스택(C#)
전언
최근에 나는 실직을 해서 몇 주 동안 새로운 일자리를 찾는 일부분으로 기술 면접을 자주 본다.비록 모든 항목이 독특하지만 면접관은 종종 같은 질문을 한다.나는 내가 만난 가장 흔히 볼 수 있는 면접 문제를 기록하고 나의 답안을 쓰기로 결정했다.
두 직장 사이에서 면접 준비는 지루할 수도 있다.그러므로 저는 여러분의 이 시리즈에 관심을 환영합니다. 이 시리즈에서 저는 모든 게시물에 서로 다른 인터뷰 주제를 포괄하려고 합니다.나는 정기적으로 이런 것들을 쓸 것이니 다른 사람에게 도움이 되었으면 좋겠다.
주의: 만약 당신이 잘못을 발견한다면, 평론에서 나에게 알려주십시오. 나는 그것을 바로잡을 것입니다.감사합니다!
쌓아올리다
Q: C#의 객체는 어디에 할당됩니까?
C#에는 두 가지 객체가 쌓이고 쌓일 수 있습니다.
창고에 분배된 대상은 창고 프레임워크에서만 사용할 수 있고, 창고에 분배된 대상은 어디서든 접근할 수 있습니다.
Q: 창고에는 어떤 대상이 분배되었고, 창고에는 어떤 대상이 분배되었는가?
주의: 인용 유형은 무더기에서 분배되고 값 유형은 무더기에서 분배된다고 절대 말하지 마세요. 이것은 흔히 볼 수 있는 중복 오류로 경험이 풍부한 면접관에게 위험 신호입니다.
인용 형식 (클래스, 인터페이스, 의뢰) 은 항상 무더기로 분배됩니다.
인용 대상을 매개 변수로 전달하거나 변수에 지정할 때 사실상 인용을 전달합니다.인용된 대상이 아니라 창고나 더미에 인용을 분배할 수 있습니다.
코드가 접근할 수 있도록 대상에 대한 인용을 전달함으로써, 대상이 쌓여 있는 위치를 알 수 있습니다.
객체를 참조로 전달할 때마다 참조 자체가 복사됩니다.이것은 인용을 다른 대상을 가리키도록 변경할 수 있음을 의미하며, 이전 대상 자체나 다른 인용에 영향을 주지 않습니다.인용은 경량급이고 항상 일정한 크기 (32비트 또는 64비트, 운영체제의 위치에 따라) 이기 때문에 그것을 복제하는 것은 (인용 유형을 전달하는 것) 저렴한 것으로 여겨진다.
더미나 창고에 분배치 유형(
System.ValueType
에서 파생, 예를 들어 int
, bool
, char
, enum
과 그 어떠한 struct
)은 그들의 성명 위치에 달려 있다.struct
은 ref struct
으로 선언할 수 있으며, 이 경우 참조 유형에서 선언되지 않도록 항상 스택에 할당됩니다.값 유형의 인스턴스는 복사본을 통해 전달됩니다(참조된 의미와 함께 사용되지 않는 한 아래 참조).즉, 변수에 값 유형을 지정하거나 매개변수로 전달할 때마다 값이 복사됩니다.
복제된 값 유형은 객체의 크기에 따라 값이 비싸질 수 있으므로 메모리가 큰 객체를 값 유형으로 선언하는 것은 바람직하지 않습니다.
C#의 각 유형은
System.Object
에서 파생되므로 값 유형을 변수에 할당하거나 원하는 object
에 전달하는 방법입니다.이런 상황에서 컨테이너라고 불리는 작업에서 값은 인용 형식으로 포장된 더미에 복사되어 저장된다.물음: 인용의 의미를 가진 값 형식을 사용할 수 있습니까?
ref
과 out
, ref return
과 ref local
(C#7.0), in
(C#7.2) 등의 키워드는 인용을 통해 접근할 수 있는 값 유형을 허용한다.이는 이 값 유형의 생존 기간이 소비 코드의 생존 기간보다 길면 소비 코드는 이 값에 대한 인용을 받아들여 복제하지 않고 창고에 있든 쌓여 있든 상관없다는 것을 의미한다.물음: 메모리를 쌓는 것은 어떻게 방출합니까?
창고를 포함하는 프레임워크가 팝업되면 창고에 저장된 대상은 사라지고, 창고에 저장된 대상이 사용하는 메모리는 쓰레기 수집기에서 방출해야 한다.
더미에 저장된 대상이 더 이상 그것을 가리키는 인용이 없을 때, 그것은 쓰레기 수집을 할 자격이 있다고 여겨진다.
어느 순간 쓰레기 수집기가 시작되어 실행 중인 모든 라인을 중단하고, 지우려는 대상의 종료기 (특수한 종료기 라인에서) 를 호출한 다음 메모리를 사용할 수 있도록 표시합니다.
물음: 메모리의 분배와 분배 취소로 인해 어떤 문제가 발생할 수 있습니까?
무더기의 메모리가 분배되고 분배가 취소됨에 따라, 그것은 지리멸렬하게 변할 것이다.다음 그림을 참조하십시오.
HEAP:
---][-------][----------][-----]........
obj 1 obj 2 obj 3 free
obj 2
의 할당이 취소되면 메모리가 유휴 상태가 됩니다.HEAP:
---][-------]............[-----]........
obj 1 free obj 3 free
현재, 실행할 때 더미에 다른 대상을 분배해야 한다면, obj 2
이 방출한 메모리를 사용할 수 있지만, 전제는 새로운 대상이 확실히 적합하다는 것이다.메모리가 부족하면 다음과 같이 작업 세트를 확장하여 운영 체제에서 연속 메모리를 더 요청할 수 있습니다.HEAP:
---][-------]............[-----][--------------------]...
obj 1 free obj 3 obj 4
파편화로 메모리 사용 효율이 떨어지다.이 문제를 해결하기 위해 쓰레기 수집기는 틈이 없도록 메모리를 재배치할 수도 있다.이것은 주위의 바이트를 간단하게 복제하여 완성한 것으로 조작을'파편정리'라고 부른다.HEAP:
---][-------][-----][--------------------]...............
obj 1 obj 3 obj 4 free
물음: 큰 대상 더미는 무엇입니까? 그 용도는 무엇입니까?메모리를 소모하는 크기에 따라 메모리 조각 정리가 비싸질 수 있는데, 이것이 바로 더미가 소대상더미(SOH)와 대대상더미(LOH)로 더 나뉘어지는 이유다.
대상이 85kbytes보다 작으면 SOH에 저장되며, 그렇지 않으면 LOH에 저장됩니다.경험에 따르면 이 85000바이트의 경계점은 파편정리로 설계되어 성능 우위를 제공하지 않는 경계점으로 설계되었다.
CPU가
double
을 처리하는 방식 때문에 double
의 배열은 예외이며, 배열의 요소가 1000개를 넘으면 이러한 대상은 LOH에 저장된다.LOH의 메모리(일반)는 조각을 정리하지 않고 메모리 사용 효율을 낮추는 대가로 더 좋은 성능을 제공합니다.
Reference
이 문제에 관하여(인터뷰 질문: 스택 및 스택(C#)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tyrrrz/interview-question-heap-vs-stack-c-5aae텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)