2011-10-24 2 views
5

간단한 클래스가 있습니다.게터에 비용이 들지 않습니까?

class A { 
    public: 
    int get() const; 

    private: 
    void do_something(); 
    int value; 
} 

int A::get() const { 
    return value; 
} 

getter 함수는 간단하고 직관적입니다. 게터가 그들을 사용해야하므로 do_something에서 value에 액세스하려면 get()을 사용해야합니다. 내 질문은 : 컴파일러는 getter를 최적화 할 것이므로 데이터에 직접 액세스하는 것과 동일 할 것인가? 또는 직접 액세스하면 성능이 향상 될 것입니다 (디자인이 나쁜 것은 무엇입니까?).

A::do_something() 
{ 
    x = get(); 
    // or... 
    x = value; 
} 
+0

실제 질문은 물론입니다. * 중요합니까 *? 왜냐하면 그렇지 않다면, 누가 신경 써? 그리고 만약 그렇다면, 당신 만이 당신의 컴파일러가 최적화를 수행 하는지를 확인할 수 있습니다. –

답변

7

메서드가 가상이 아닌 경우 컴파일러에서 메서드를 최적화 할 수 있습니다. 좋은 컴파일러 (링크 타임 최적화 포함)는 메서드가 inline이 아니고 최적화 된 경우에도 별도의 .cpp 파일로 정의 할 수 있습니다. 별로 정의되지 않은 클래스는 클래스 정의 또는 헤더 파일 inline 키워드로 선언 된 경우에만 그렇게 할 수 있습니다. 가상 메소드의 경우, 의존하지만, 그렇지 않을 가능성이 큽니다.

+0

'가상 '것을 언급하기에 좋다. – iammilind

+3

가상 함수의 경우 컴파일러가 동적 유형을 알고 있는지 여부에 따라 다릅니다.가상 함수의 가장 빈번한 사용으로 인해 문맥이 생길 수는 없지만 예외가 있으며 컴파일러가 가상 함수를 인라인하는 것에 따라 적어도 하나의 관용어를 알고 있습니다. –

3

컴파일러는 정의에 대한 액세스 권한이있는 경우 거의 확실하게 그러한 게터를 인라인합니다.

+0

클래스 밖에서 정의함으로써'inline' 키워드없이 getter를 인라인할까요? – ks1322

+0

@ ks1322 : 멤버 함수의 클래스 정의는 암묵적으로'inline'으로 선언됩니다. – Nawaz

+0

@ Nawaz, 나는이 특별한 경우에 인라인 될 것인가를 묻고있다 ('inline' 키워드가 없으며, 클래스의 ** 외부 ** 멤버 함수가 정의되어있다)? – ks1322

2

게터가 클래스 내부에 정의되거나 암시 적으로 inline 키워드로 정의되는 인라인 함수로 정의되는 경우 컴파일러는 일반적으로 인라인 함수로 인라인하며 이는 호출시 오버 헤드가 없습니다.

그러나 디버그 빌드에서는 인라인을 사용하지 않는 것이 일반적입니다. 컴파일러가 인라인 할 필요가 없으므로 완벽하게 유효합니다.

1

글쎄, 값을 얻는 데 관련된 실제 로직을 숨기기 때문에 get을 사용하는 것이 일반적으로 더 좋습니다 (오늘은 필드입니다, 내일은 더 복잡한 로직이 필요할 수도 있습니다). 성능에 관해서는 값 자체에 액세스하는 것이 get을 사용하는 것보다 항상 빠르지 만 컴파일러는 어쨌든 호출을 인라인 할 가능성이 높습니다.

int& get(); 

가 지금은 참조를 반환하고 변경할 수 있습니다 : 당신은 값이 아닌 참조를 반환하지 않는 경우

1

는 먼저 개체 내부의 값 를 조작 할 수 없습니다. 그러나이 아주 깨끗한하지 IMHO, 당신은 또한 세터를 정의하고 변경된 값을 다시 쓰기를 사용한다 :

int get() const; 
void set(int); 

... 
A::do_something() 
{ 
    x = get(); 
    set(value); 
} 

세터의 성능은 컴파일러에 따라 달라집니다. 대부분의 최신 컴파일러는 간단한 getter/setter를 인라인 할 수 있으므로 성능 손실이 없어야합니다.

관련 문제