본문 바로가기

C++ Programming/Exceptional C++ style

const 최적화

1. 다음 코드에서

const Y& f(const X& x){
   //...x에 대해 뭔가 수행하고 Y 객체 하나를 찾는다. 
 return someY;
}
  -> 매개변수나 반환값 또는 둘 다를 const로 선언하는 것이 컴파일러가 좀 더 최적의 코드를 생성하는데 , 또는 더 나은 코드를 생성하는 데 도움이 될까? 그렇다면(또는 아니라면) 왜 그런것일까?

  const가 최적화에 생각만큼 도움이 되지 않는다. 

  1) const 멤버함수를 호출한다고 해도 컴파일러는 객체 x나 객체 someY의 비트들이 변하지 않을 것이라고 가정 할 수 없다.  x나 someY와 같은 객체들을 다른 이름으로 지치앟는 비 const참조를 가진 다른 코드가 있을 수도 있으며 동일한 객체에 대한 비 const참조들이 f의 실행도중에 우발적으로 쓰이게 될 수도 있다. 
  2) x와 someY가 const로 선언되었다고 해서 반드시 그 비트들이 물리적으로 const라는 보장은 없다. 클래스가 mutable 멤버들을 가지고 있을 수도 있기 때문이며 또는 그와 동등한 장치, 즉 멤버함수안에 const_cast같은 것들이 있을 수도 있기 때문이다.
  3) const가 뭔가 의미하는 경우는 한 가지이다. 객체가 정의되는 시점에서 const가 되는 것이다. 

  void f(const String s){
       s[4];
    }
   위 코드에서 String이 const String에 대한 operator[]호출이 문자열 내용을 변경하지는 않는다는점을 알고 있다면 char& 대신 char를 값으로 반환하는 const 버전의 operator[]를 제공하는 것이 도움이 된다. String에 대한 깊은 복사가 일어나지 않으므로 코드가 좀 더 최적화된다.

-> 좀더 나은 방법

   void f(const Z& z){

   }
 
   결론 : 객체를 const값으로 전달하는 것은 피하라. 대신 const에 대한 참조를 전달하는 것을 선호하라. 단, int같이 복사비용이 싼 객체라면 차이가 없다.