문제

이것은 매우 간단한 질문 일지 모르지만 컴파일의 내부 작업 중 일부를 이해하려고 노력하고 있습니다.

간단히 말해서 임의의를 상상해보십시오 물체 인스턴스화되고 있습니다. 그런 다음이 객체는 힙에 할당됩니다. 객체에는 a가 있습니다 재산 get 및 세트 메소드가있는 유형 Pointf (값 유형)의 유형.

작업을 수행하기위한 몇 가지 계산이 포함 된 GET 및 세트 방법을 상상해보십시오. 이 코드는 언제 어디서 (스택/힙) 인스턴스화됩니까?


이것은이 질문의 배경입니다.

객체에 대한 방법을 작성하고 설정하고 있으며 이러한 방법에 매우 자주 액세스해야합니다. Get and Set Code 자체는 다소 방대하기 때문에 최악의 시나리오에서 방법은 속성의 모든 액세스에 대해 모든 내부 코드가있는 객체 또는 값 유형으로 인스턴스화 될 것이라고 우려했습니다. 반면에 주 객체가 생성 될 때 코드가 인스턴스화되고 CPU는 단순히 속성 코드 시작에 JMP에게 지시됩니다. 어쨌든, 이것은 내가 명확히하고 싶은 것입니다.

도움이 되었습니까?

해결책

방법 (또는 속성)이 인스턴스화되지 않습니다. 당신은 내가 한 번했던 방식을 생각하는 것 같습니다. 클래스의 인스턴스를 만드는 것은 데이터 공간을 할당 할뿐만 아니라 코드에도 할당됩니다. 이것은 사실이 아닙니다.

C ++에서도 이것이 작동하는 방식은 가상 기능 테이블 또는 vtable (가상 함수 테이블 또는 vtable)에 대한 포인터와 함께 데이터가 할당 될 것입니다. vtable의 항목은 가상 방법을 가리 킵니다. 비 초반의 방법은 vtable에 항목이 필요하지 않습니다.

두 경우 모두, 몇 개의 개체가 인스턴스화되었는지에 관계없이 코드의 단일 사본 만있었습니다.

다른 팁

내 사본이 없습니다 C#을 통해 CLR 여기 나와 함께하지만, getters와 setter of properties는 특별한 장식을 가진 클래스의 방법 일뿐입니다. Jeffery Richter의 훌륭한 책에는 모든 세부 사항이 있습니다.

실행 가능한 코드는 스택이나 힙에 할당되지 않으며 필요한 경우 jit'er에 의해 편집되고 해당 메모리가 따로 설정됩니다. 한 번. 즉, 당신은 본질적으로 비 문제가 무엇인지 걱정하고 있습니다. 또한 메모리 할당과 관련하여 쓰레기 수집가가 무엇을하는지 추측하지 마십시오.

그들은 방법과 다르지 않습니다.

인스턴스화한다는 의미가 확실하지 않지만 Getter의 실행 시간이 걱정된다면 응답을 캐싱하는 것을 생각할 수 있습니다. 그래도 Getter가 실제로 귀하의 프로그램의 성능을 상하게한다는 것을 확인할 때까지는 그렇게하지 않을 것입니다.

에 따르면 MSDN 의이 페이지 속성과 방법에는 몇 가지 중요한 차이점이 있습니다. 특히 반환 배열과 관련하여 속성은 전체 배열을 반환하기 전에 전체 배열의 얕은 사본을 수행하므로 대신 사용자 정의 기능을 사용하려는 상황입니다.

그러나 위에서 설명했듯이, 어떤 식 으로든 기능 대신 속성을 사용하면 프로그램이 성과 페널티로 고통받는 지 알고 싶었습니다. 전반적으로 나는 설명 할 수없는 이유에 대해 속성이 함수보다 평균 약 5% 느리다는 것을 알았습니다. 속성은 PropertyDescriptors 등과 같은 다양한 "보이지 않는"객체를 자랑하기 때문일 수 있습니다. 그 외에도 구현은 상당히 유사한 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top