2016-09-18 11 views
0

Richter "CLR via C#"유명한 책언 박싱. 대부분의 경우에 스택 필드 복사

언 박싱 할 때는 힙에 unboxed 값에 대한 포인터를 반환하지만 C#에서는 포인터를 얻을 수 없다는 것을 이해합니다. 힙에서 스택으로 복사 된 필드 복사 (응답 된 here). 내가 개체의 언 박싱 할 내가 너무

Console.WriteLine(v + ", " + (Int32)o); 

하지만, "O"만 포인터를 복사하지 않고, 통과시켰다. "...이 작업에는 복복 작업이 필요하지만 복사 작업이 필요하지 않습니다." (Richter, 129 페이지)

이제 내 질문은 : 힙의 unboxed 값을 포인터로 반환 할 때와 복사 한 시점 스택에?

감사

P.S : 코드 :

 Int32 v = 5; 
     Object o = v; 
     Console.WriteLine(v + ", " + (Int32)o); 
+0

코드는 Richter의 저서 (1 줄 빼기)에서 그대로 복사되고 정상적으로 컴파일됩니다. – Philippe

답변

1

unbox 자체가 값을 복사하지 않습니다. 그럼에도 불구하고 그 값은 사용될 때 복사됩니다. Richter의 저서에서 나온 예제에서 바로 뒤 따르는 연산 인 box은 값을 새로운 박스 값으로 복사합니다.

+0

안녕하세요. 대답 주셔서 감사합니다,하지만 제 질문은 : 값을 복사 할 때 unboxing을 수행하는 동안 감사합니다 – zzfima

+0

@zzfima ** 값을 복사하지 않을 때 ** ** 상자를 풀 때 사용하지만 거의 항상 복사됩니다 ** 이후 ** 가치. 어떤 종류의 복사 ('&'연산자로'안전하지 않은 코드 '조차도)가없는'unbox'로 컴파일 될 C# 코드는 모르지만 IL에서 직접 할 수는 있습니다. Richter는 "o"를 언 박싱 할 때 복사되지 않고 포인터 만 – Philippe

+0

입니다. 그리고 나서'o'에 대한 상자 안의 값은'String.Concat()'에 대한 호출을 위해 다시 상자에 넣어집니다 (따라서 새로운 상자 안에 복사합니다). 그것이 리히터가 실제로 3 개의 권투가 있다는 것에 놀랄 수 있다고 말한 이유입니다. 상자에서 스택으로의 첫 번째 복사본이 없으며 두 번째 복사본은 두 번째 상자로 이동하고 첫 번째 상자에서 두 번째 상자로 바로 복사합니다. – zzfima