2014-12-19 7 views
0

함수를 선언 할 때 이점이 있는지 궁금합니다. const.const 멤버 함수/메서드의 유용성

나는이 메서드가 비 정적 클래스 멤버을 수정할 수 없다는 것을 알고 있지만, 이것을 수행하는 유일한 방법은 다른 사람이 함수를 비 정적 멤버를 수정하는 것으로 다시 구현하지 못하도록하는 것입니다. , 또는 성능 차이가 있습니까? 성능 차이가 있다면 컴파일러가 일반적으로 inline 함수와 같이 인간보다 더 나은 작업을 수행 할 가능성이 있습니까?

그냥 나는 다음과 같은 멤버 함수의 차이에 대해 질문하고, 명확하게 : 나는 함수가 비 정적 클래스 멤버를 수정할 수 없음을 의미 알고

float getWidth() const 
{ 
    return width; 
} 

float getWidth() 
{ 
    return width; 
} 
+2

답변 및 의견 읽기 귀하의 질문이 확실하지 않은 것으로 확신합니다 ... const 방법에 대해 이야기하고 있습니까? 또는 constexpr 함수? const 함수는 없습니다 ... –

+0

내가 묻는 것을 명확하게하기 위해 질문을 업데이트했습니다. – danielunderwood

+1

당신은 const 메소드 나 const 멤버 함수에 대해 이야기하고 있습니다. const 함수는 말할 수 있지만 함수는있을 수 있지만 const 함수는 없을 수 있습니다. –

답변

3

변수를 const으로 선언하면 컴파일러에서 여러 가지 최적화 작업을 수행 할 수 있습니다. 그것은 strict aliasing rule의 강화로 간주 될 수 있습니다. 두 개의 포인터가 같은 유형 인 경우 일반적으로 컴파일러는 별칭을 지정할 수 있다고 가정해야합니다. 그러나 하나가 선언되었거나 const으로 사용되면 컴파일러는 해당 연산과 관련하여 잠재적 인 앨리어싱을 무시할 수 있습니다. 이렇게하면 불필요한로드 및 유출을 줄여보다 간단하고 빠른 코드로 이어질 수 있습니다.

올바르게 코드를 다른 코드와 상호 운용 할 수 있도록 코드 const을 올바르게 작성하는 것도 중요합니다. 상황에 따라 const 한정자를 버리면 정의되지 않은 동작이 호출 될 수 있으므로 함수가 const이 아닌 경우 일반적으로 const 객체에서 함수를 사용할 수 없습니다. 이것은 const 개체가있는 모든 사람에게 문제가됩니다.

7

아니요, const는 그런 것을 의미하지 않습니다. 즉, 상수 개체에서 해당 함수를 호출 할 수 있어야합니다. 이는 중요한 작업입니다. 비 const 멤버 함수에서 비 정적 데이터 멤버를 실제로 수정하지 않더라도 상수 개체에서 호출 할 수 없습니다.

struct A 
{ 
    void f() 
    { 
    } 
}; 

void g(const A& a) 
{ 
    a.f(); // error 
} 

세부 기술적 CONST 는이const ClassName*보다는 Classname*의 것을 의미한다. 나머지 규칙은이 정의의 직접적인 결과입니다.

여기서는 잠재적 인 성능 차이가 매우 중요하다고 생각하지 않습니다.

+1

'const' * 컴파일러가 특정 최적화를 허용하지만, 대부분은 엄격한 앨리어싱 규칙에 의해 이미 활성화되어 있습니다. 특히, 객체가'const' 인 경우, 그 객체에 대한 포인터는 일반적으로 한정자를 보존해야합니다 (당신은'const_cast'로 그것을 버려야 만합니다). 이를 통해 컴파일러는로드 및/또는 누출을 줄이거 나 없앨 수 있습니다. – Kevin

+0

오 실제로는 내가 본 상수 함수에 대한 설명보다 더 의미가 있습니다. 나는 그것이 나의 오해가 있었던 곳이라고 생각한다. 그래서 만약 당신이'const'가 아닌 객체를 'const' 함수를 호출하려고 시도했다면, 컴파일러 에러를 얻게 될까요? 또한, 당신의 코드 샘플에'const' 함수가 아니라'const' 인수가 있다는 것을 편집에서 알 수 있습니다. 하지만 당신이 설명하는 것은'const' 함수에 대한 것입니다, 맞습니까? – danielunderwood

+2

@ 케빈 : 나는 성능 차이가 거의 없거나 거의 없다고 말하지 않았다. Constant-correctness에 대한 선호도가 훨씬 더 중요한 이유가 있기 때문에 중요하지 않다고 말한 것입니다. –

2

함수 선언은 함수 (메서드)와 호출자 간의 바인딩 계약을 형성합니다.

컴파일러가 논리적으로 올바른 프로그램을 시행 할 수 있기 때문에 이것은 매우 중요합니다 (프로그래머가 계약을 파기하려고 시도하면 컴파일되지 않습니다).

이것은 함수와 인수 목록을 선언 할 때 가장 중요하게 고려해야 할 사항입니다.

계약은 다음과 같이 :

struct A { 
    // func promises not to alter the internal state of *this 
    void A::func() const; 

    // func reserves the right to modify the internal state of *this 
    void A::func(); 
}; 

// func asserts that it reserves the right to modify a 
void func(A& a); 

// func asserts that it absolutely won't (actually can't) modify a 
void func(const A& a); 

// func asserts that it will take a copy of a, which it can modify, 
// store or destroy as it sees fit 
void func(A a); 

는 컴파일러 (컴파일 실패하는 A &을 exptecting되는 함수에 CONST A를 통과하는)이 계약을 적용 것을 기억하십시오.

이것은 정확성을 강화하고 성능과는 아무런 관련이 없습니다.

관련 문제