2012-01-09 6 views
2
public class Foo 
{ 
    public void Draw() // Called 60 times per second 
    { 
     spriteBatch.Draw(new Vector2(x, y), null, Color.White); 
    } 

    private float x, y; 
} 

특히, new Vector2(x, y) 호출이 쓰레기를 생성하는지 궁금합니다.이 샘플은 가비지를 생성합니까?

내 이해 Vector2 형이고, 참조 형의 부재로 저장되어 있지 않기 때문에, 그것은 스택에 생성 될 것이라는 점이다. 따라서 Draw 메서드가 반환 되 자마자 메모리가 자동으로 회수되어 가비지가 생성되지 않아야합니다.

맞습니까?


편집

나는 에릭 Lippert의 초기 포스트에 대한 자세한 설명을 요청하는 경우가 있습니다.

질문 1)

는 호출 된 함수의 상기 제가 파라미터가 참조 형식 또는 값 유형을 얻어 여부에 달려있다. 값 유형을 취한 후 아니오를 입력하면 여기에 가비지가 생성되지 않습니다. 참조 유형이 있으면 값이 박스에 표시됩니다.

서명이 이렇게 될 일이 그런 경우 :

public void Draw() 
{ 
    Vector2 vector = new Vector2(x, y); 
    spriteBatch.Draw(ref vector, null, Color.White); 
} 

그것은 벡터에서 쓰레기를 생성하는 것이 박스되고?

질문 2) 논리적으로는 스택에 생성되는 것을 수반하지 않는 힙에없는해서

. 등록부에있을 수 있습니다.

하지만 레지스터에 저장되는 것으로 가정하면 가비지 수집기의 관점에서 스택에 저장되는 것처럼 동작합니다. 그 맞습니까? 합니다 (Color 바와 같이)

답변

5

new Vector2(x, y) 호출이 쓰레기를 생성하는지 궁금합니다.

호출 된 함수의 첫 번째 형식 매개 변수가 참조 형식인지 또는 값 형식인지 여부에 따라 달라집니다. 값 유형을 취한 후 아니오를 입력하면 여기에 가비지가 생성되지 않습니다. 참조 유형이 있으면 값이 박스에 표시됩니다.

내 이해 Vector2이 값 유형이며, 참조 형식의 구성원으로 저장되지 않기 때문에이 온되지 않기 때문에,이

다만 스택에 생성 될 것이라는 것이다 힙은 논리적으로 스택에서 생성된다는 것을 수반하지 않습니다. 등록부에있을 수 있습니다.

"ref"("ref"또는 "out"수정자를 사용하여) 구조체를 전달하는 데 필요한 서명이 있다면 어떤 복싱이라도 될까요?

아니요. 두 가지 종류의 참조가 혼합되어 있습니다.

void D(int q) {} 
void D(ref int q) {} 
void D(object q) {} 

첫번째 방법 D는 정수의 복사본을 취 가변 별칭 이고 A "참조"는 목적이 아니다. 두 번째 D는 박스 화되지 않은 정수를 포함하는 변수에 별칭을 만듭니다. 세 번째 D는 박스형 정수를 취합니다.

가비지 수집기 관점에서 스택에 저장되는 것처럼 동작하는 레지스터에 저장되어 있다고 가정합니다.

이는 유효한 가정은 아닙니다. 등록 또는 스택에있는 값이 인 경우 가비지 수집 객체에 대한 참조가 포함되어 있다고 가정합니다. 지터는 스택 참조와 다르게 등록 된 참조를 처리 할 수있는 권한 내에 있습니다. 예를 들어, 지터의 레지스터 할당 알고리즘이 참조가 더 이상 참조 해제되지 않는다는 것을 지터가 알고 난 후에 다른 레지스터에 대해 해당 레지스터를 다시 사용하기로 결정했다고 가정합니다. 지터는 가비지 컬렉터에게 참조가 사라 졌음을 알리는 데 완전히 자유 롭다. 이렇게하면 개체의 메서드가 실행 중일 때도 'this'가 GC 스레드에 의해 해제 될 가능성이 있습니다.

물론 지터는 스택에서도 자유로울 수 있지만 더 적극적인 최적화가 될 것입니다.

+0

XNA - 메소드 서명은 값으로 'Vector2'를 허용합니다. 권투 언급에 대해 +1. –

+0

훌륭한 의견을 보내 주셔서 감사합니다.하지만 새로운 일련의 우려가 제기됩니다. 아마 제 편집을 좀 봐 주시겠습니까? –

+0

그냥 '참조로 전달 될 때 값 유형의 복싱이 없습니다.'라는 문서를 발견했습니다. "참조로 값 유형 가져 오기"를 "참조 유형 가져 오기"와 동일하게 오해 한 것 같습니다. –

3

수정 한 Vector2는 관련 스택 프레임에 살 것이다 - 그러나주의 :이 ref에 의해 전달되지 있기 때문에 값이 Draw 스택 프레임에 복사됩니다. Vector2은 실제로 작습니다 (64 비트/8 바이트). 가장 가능성이 큰 문제는 아니지만 - 각 스택 프레임이 Vector2으로 끝나면 메모리가 다시 확보됩니다.

+0

감사합니다. 벡터가 복사된다는 사실을 포함하여 모든 것이 명확 해졌습니다. 나는 오늘 내 모든 표를 사용했지만 내일은 상향 투표 할 것입니다. –

관련 문제