2017-01-25 1 views
3

오버로드 된 접미사 연산자를 최적화하고 접두어 연산자로 바꿀 수 있습니까? 다음 코드에서 대부분의 컴파일러는 ++i으로 i++ 치료와 같은 어셈블리를 생성, 예를 들어오버로드 된 접두어/접미어 컴파일러 최적화

(컴파일러 기능 과부하가 무엇을 알고있는 경우).

for(int i=0; i<5; i++) 
    printf("*"); 

그러면 다음 코드도 동일하게 적용될 수 있습니까?

class Integer { 
    int data; 
    Integer& operator++() { ++data; return *this; } 
    Integer operator++(int) { Integer ret = *(this); ++(*this); return ret; } 
    // And more overloads... 
}; 

for(Integer i=0; i<5; i++) 
    printf("*"); 

답변

4

최적화 너무 오래는 코드의 동작을 변경하지 않는 한 아무것도을 할 수있다. (이것은 the "as-if" rule으로 알려짐)

그래, 첫 번째 코드에서 ++ii++은 대부분의 컴파일러에서 똑같이 최적화됩니다. (그런 경우가 아니었지만, 저와 같은 오래된 고양이는 여전히 for 루프에서 ++i을 사용합니다.).

두 번째 경우 컴파일러는 반환 된 결과가 사용되지 않는다고 가정하고 명명 된 반환 값 최적화 (NRVO) 확장의 일부로 값 복사본을 최적화 할 수 있습니다.