const에 대한 잘못된 믿음으로, "컴파일러가 const 객체를 상수 비트로 올려 최적화를 시킨다." 라는 믿음이 있다. 이번 항목에선 "왜 이런 믿음이 생겼는지?", "어떤 경우에는 안되는지?" 에 대해서 이야기 한다.
알다시피 질문을 통해 접근해 보도록 한다.
1 ) 다음 코드에서
매개변수나 반환값 또는 둘 다를 const로 선언하는 것이 컴파일러가 좀 더 최적의 코드를 생성하는 데, 또는 더 좋은 코드를 생성하는데 도움을 줄까? 주거나 말거나 왜 그런것인가?
매개변수의 const 좀더 좋은 최적화를 거치는가?
음, 우선 const 매개변수를 봐 보자. const X& x 를 받는데, & 이기 때문에, 객체를 생성하지는 않는다. 그 뒤에 const 를 붙여서, "상수 비트"에 올라가지 않을까? 생각 될 수 있겠지만, 상수 비트에 올라가지 않는다. 왜냐하면, 상수 비트에 올라갈 때가 "컴파일 타임"에 이루어 지기 때문이다.(.. 내 경험상 그랬다. 이래야 아귀도 맞는데, 확신이 들만한 문서를 못찾겠다! )
런타임에 이루어 지는 매개변수는 절대 상수비트에 올라가지 않는다. 그러므로 좀 더 좋은 최적화를 거치지 않는다. 만약 const int& i 를 받아 int ay[i]; 는 절대로 컴파일 되지 않는 것을 볼 수 있을 것이다.
예제 코드
그렇다면 이것이 의미하는게 무엇인가? 그냥 넘기지 왜 const를 붙이는가!?
x의 객체를 변화시킬 수 있는 함수나, 내부 변환을 허용하지 않겠다고, 룰을 정하는 효과를 가지게 된다. 이는 프로그래머의 가독성과 예측을 도와주는 효과를 가지게 되기 때문에, "쓰지 않아야 하지 않다면, 써주는 게 좋다." 여기서 표현이 "쓰지 않아야 한다면" 인데, 즉, const 를 쓰면 안될 때를 제외하곤, 써주라는 말이다. ^^
그러면, 반환값의 const 도 최적화 안해주는가?
.. 최적화는 무슨 최적화, 버그가 생길 코드다, 절대 지역변수를 참조형태로 반환하는 함수로 만들지 말아야 한다. 함수가 리턴된 순간 없어질 변수이기 때문이다!
또한 이 역시 런타임 변경 가능 변수이기 때문에, 상수 비트에 올라기지 못한다.
결론 : "이 코드에서, 좀 더 최적의 코드를 생성하는데 아무 도움을 주지 않는다."
2 ) const의 존재 여부가 컴파일러의 코드 생성 개선에 도움이 되는 또는 되지 않는 이유를 일반적인 관점에서 서술하라.
질문 1에서 "되지 않는 이유"에 대해서 서술 했다. 그렇다면, 좀 더 도움이 되는 최적화 코드는 무엇인가?
만약, 상수 비트에 올라가게 되면, 컴파일 타임에 접근, 사용 할 수 있게 된다. 특히 POD형이라면, 좋은 효과를 얻을 수 있다고 한다.(POD 란? http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html)
책에선 메모리 이미지를 컴파일 시점에 생성하고 그것을 프로그램의 실행 파일 이미지에 직접 집어넣을 수 있는 경우 많은 도움이 된다고 한다.
- 이 부분은 좀 더 자료를 찾아 봐야 겠다. 도움 되는 코드를 못찾겠다. -
3 ) 다음 코드를 보고,
a. 이 const 지정이 더 나은 코드를 생성하는데 도움이 되려면 어떠한 상황이여야 하며, 또 클래스 Z가 어떤 종류의 클래스이어야 할지 논하라.
- Z의 복사 생서자의 정의, 그리고 f의 본문안에서 호출되는 Z의 모든 함수들의 정의들이 보여야 한다.
- 그 함수들의 모두 상당히 단순하고 부수 효과(side effect)가 없어야 한다.
- 컴파일러가 매우 훌륭한 최적화기를 갖춰져 있어야 한다.
만약 위의 조건을 만족한다면, Z의 복사 본을 생성하지 않고 f를 호출 할 수 있다. 하지만 이것은 표준과 많이 차이가 난다. 그러므로 된다면, 주의를 요한다고 책에 적혀있다. (... 이럴 꺼면 안쓴다.)
b. 질문 a에서 답한 것들에서, 더 나은 코드를 생성한다는 것이 컴파일러 최적화에 대한 것인가? 다른 종류의 최적화 인가?
... 아무리 봐도 이건 프로그래밍의 최적화이다. 성능상의 이점 보다는, 가독성, 실수 방지를 위한 최적화라고 보여 진다. 왜냐하면, 대부분의 경우, 좀 더 나은 최적화를 컴파일러가 해 주지 않기 때문이다.
c. 같은 효과를 얻으면서, 표준에 만족하는 방법은 없는가?
.. const Z& z 로 받으면 된다. .. 이 얼마나 쉬운가?
총평
상수 비트에 대해서 좀 더 찾아봐야 겠다. 상수에도 물리적 상수와 논리적 상수가 있는거 같다. 그리고 영어 시작해야겠다. 도저히 안되겠다. 답답해서...
'책 정리 > Exceptional C++ Style' 카테고리의 다른 글
항목 29 : 초기화인가 아닌가? ( 난이도 : 3 ) (0) | 2009.01.25 |
---|---|
항목 28 : 키워드의 비밀 ( 난이도 : 3 ) (0) | 2009.01.24 |
항목 27 : 자료 포맷과 효율성, 2부 : 비트 다루기 ( 난이도 : 8 ) (0) | 2009.01.24 |
항목 26 : 자료 포맷과 효율성, 1부 : 간결함 ( 난이도 : 4 ) (0) | 2009.01.24 |
항목 25 : inline 해부 ( 난이도 : 7 ) (0) | 2009.01.23 |
항목 23 : new와 예외, 2부 : 메모리 관리의 실질적인 문제들 ( 난이도 : 5 ) (0) | 2009.01.22 |
항목 22 : new와 예외, 1부 : 여러 종류의 new ( 난이도 : 4 ) (0) | 2009.01.22 |
항목 21 : 컨테이너의 메모리 사용, 2부 : 얼마나 큰가? ( 난이도 : 3 ) (0) | 2009.01.22 |
항목 20 : 컨테이너의 메모리 사용, 1부 : 메모리 관리의 여러 수준 ( 난이도 : 3 ) (0) | 2009.01.22 |
항목 19 : 파생된 클래스들에 대한 규칙 강제 ( 난이도 : 5 ) (0) | 2009.01.19 |
최근댓글