C++ 상수 비트에 대해서 아시나요?
글쓴이: ikpil / 작성시간: 금, 2009/01/23 - 3:44오후
책을 보는 중에, 상수 객체는 "상수 비트"에 올라가서 보호받고 최적화 된다.
라고 되어 있는데, "상수 비트" 라는게 무엇인지는 설명이 나와 있지 않아 질문을 올리게 되었습니다.
구글이형에게 물어봐도, 못찾았습니다....
질문
1. "상수 비트" 라는게, 상수 들만 들어가는 메모리 영역인가요?
2. 상수 비트에 올라가면, 더 빨리 접근 할 수 있나요?
3. 상수 비트에 올라가면, 변경 할 수 없는 것인가요?
4. 고의적으로 상수 비트에 올릴 수 있나요?
5. 4번이 가능하다면, 어떤 방법이 있나요?
근래에 참 멀고, 험난한 개발자의 길을 걷고 있는거 같습니다. 우리 모두 힘냅시다.
Forums:
이 문장은 원서의
이 문장은 원서의 영어 문장을 보는 것이 훨씬 이해하기 쉽다에 100원 겁니다 =_=
컴파일러가 어떻게
컴파일러가 어떻게 돌아갈까 고민해보시면 대충 감이 오실 듯 합니다.
상수 비트에 올라간다는건 아마 내부적으로 컴파일러가 각 변수 ( 혹은 token 등의 ) state table 을 가지고 있으면서 상수인 녀석들만 따로 관리 하는 상태나 그런 개념을 말하는 것 같습니다. ( 물론 scope 에 따라 컴파일러가 각 객체의 state 를 이리저리 바꾸겠지요 ) const Object?
1. "상수 비트" 라는게, 상수 들만 들어가는 메모리 영역인가요?
- 메모리 영역을 표시한게 아니라 어떤 변수의 현재 상태가 const 인가 아닌가를 지니는거 같습니다. c++ 은 const 에 대한 casting 이 엄연히 존재하므로 상수들만 들어가는 메모리 영역이 있기 힘듭니다. ( 물론 컴파일러 레벨에서 int x = 10; 에서 10 같은 상수는 정말로 상수들만 들어가는 data segment 에 존재할 확률이 높습니다. const 가 붙은 object 가 상수 객체라는 가정하에 말씀드립니다. )
2. 상수 비트에 올라가면, 더 빨리 접근 할 수 있나요?
- 상수 비트라는 상태라면 어떤 객체가 통체로 const 일 것입니다. 내장 type이여도 마찬가지구요.( pointer 의 constness 가 아니라 pointee 의 constness 만을 가정하겠습니다. ) 따라서 객체의 member variable 들을 한번만 레지스터에 올리면 어떤 const 가 유지되는 scope 내에선 다시는 바뀔 일이 없습니다. 따라서 레지스터에 계속 올려 놓을 수 있게 배치되기가 유리합니다. 혹은 계산시에 평가를 앞으로 뒤로 옮기기가 굉장히 용이합니다. ( 그러나 그 값이 바뀔 수 있는 상황이면, 레지스터에 올렸다가 다시 메모리에 넣었다가 레지스터가 모자르면 다시 내려가서 다시 메모리를 읽어야 하는 경우도 가능하기 때문에 함부로 위치를 바꾸거나 레지스터에 고정으로 둘 수가 없습니다. ) 즉 const Object 라면 관련 변수의 값에 대한 참조의 횟수가 많으면 많을 수록 최적화가 많이 되겠지요. ( memory 를 다시 read 할 이유도 store 할 이유도 없으니까요. register 가 모자르지 않다면... ) 더 빨리 접근한다는 질문이 무엇인지는 모르겠지만, 상황에 따라 CPU레지스터에 좀 더 오래 붙어있을 확률이 높아지므로 여러번 같은 const object를 접근할때는 더 빨리 접근 할 수도 있습니다. 컴파일러 레벨에선 코드 최적화 하기도 상당히 용이합니다.
3. 상수 비트에 올라가면, 변경 할 수 없는 것인가요?
- 위에도 잠깐 언급했습니다만 const 자체가 casting 이 가능하므로 변경이 불가능하다고 생각하진 않습니다. 다만 data segment 에 박힌 상수라면 변경이 당연히 불가능합니다. ( data segment 영역을 잘 hacking 해서 덮어쓰지 않는이상 말이죠. )
4. 고의적으로 상수 비트에 올릴 수 있나요?
- 상수 비트에 올린다는게 아니라 각 객체의 constness 조정을 말하는 것이라면 상황에 따라 애매하겠군요. const 로 새로운 객체를 선언해서 copy 할 수도 있겠고 파라미터로 받을때 const 를 붙여 받을 수는 있겠습니다만, const 비트에대한 세팅을 runtime 에 한다는건 조금 무리가 있겠네요.
5. ....
Neogeo - Future is Now.
Neogeo - Future is Now.
댓글 달기