2014-07-07 1 views
1

그래서 뷰에 메서드를 전달하고 뷰 내에 포함 된 CGRect에서 일부 값의 속성을 찾고 싶습니다.네 가지 속성 (NSPoints)의 위치를 ​​저장하는 가장 효율적인 방법은 무엇입니까?

- (void)blahblah:(someView*)view 
    int originX = view.myCGRect.origin.x; 
    int originY = view.myCGRect.origin.y; 
    int width = view.myCGRect.size.width; 
    int height = view.myCGRect.size.height; 

이 방법을 쓰면 더 좋을까요?

- (void)blahblah:(someView*)view 
    CGRect sameCGRect = view.myCGRect; 
    int originX = sameCGRect.origin.x; 
    int originY = sameCGRect.origin.y; 
    int width = sameCGRect.size.width; 
    int height = sameCGRect.size.height; 

아니면 더 효율적인 방법이 있습니까?

또한 객관적으로 C 언어에 익숙하지 않으므로이 두 구현간에 차이점이 있는지 설명 할 수 있습니다. 그렇다면 무엇입니까?

+1

당신이하고있는 일은 수동적 인 "공통적 인 부분 표현식 제거"입니다. 공통 값 (여기서는'view.myCGRect')은 여러 참조 앞에 "게양 (hoisted)"되어 있습니다. 이것은 공통 코드가 루프 외부에있을 때 특히 효과적입니다. 그러나 컴파일러 (또는 JITC for Java)는 이러한 CSE를 인식하여 자동으로 "호이스트"할 수 있습니다. 그러나 수동 작업을 수행하는 경우 코드를 자주 따르기 쉽고 유지 관리하기가 더 쉽습니다. –

+0

답변 해 주셔서 감사합니다. 저는 StackOverflow에서 비교적 새로운 것입니다. 그래서 왜 당신이 대답하지 않고 대신 그냥 코멘트했는지 궁금합니다. –

+1

나는 너무 게으르다. –

답변

2

. 그 이유는 실제로 view.myCGRect이 동적으로 전달되는 메시지이기 때문입니다.

컴파일러는 어떤 메소드가 호출 될 것인지, 어떤 부작용이 있을지 모르기 때문에 의미 론적 차이가있을 수 있으므로 중복 호출을 삭제할 수 없습니다.

두 번째 코드 스 니펫이 더 효율적입니다.

0

참조 : 사용자가 수행하는 작업은 수동 값 "공통 하위 식 제거"입니다. 여기서 일반적인 값 (이 경우에는 view.myCGRect)이 여러 참조 앞에 "호이스트"됩니다. 이것은 공통 코드가 루프 외부에있을 때 특히 효과적입니다. 그러나 컴파일러 (또는 JITC for Java)는 이러한 CSE를 인식하여 자동으로 "호이스트"할 수 있습니다. 그러나 수동 작업을 수행하는 경우 코드를 자주 따르기 쉽고 유지 관리하기가 더 쉽습니다. 컴파일러는 자동으로 표현식 제거를 수행 할 수 없을 것입니다이 경우

: 이전, 이전에 허용 대답을 참조에서

관련 문제