티스토리 뷰
어제 도서관에서 Effective Modern C++을 빌려 C++ 공부를 시작했습니다.
.......
한마디로 쉽지 않더군요.
Effective Java 2는 그래도 어느정도 이해할만 했는데 말이죠. (시리즈 책은 아닙니다)
어쨋든 그동안 자바로만 열심히 공부하다 근래에 알고리즘을 공부하면서 C++를 자연스럽게
쓰게 되면서 C++에 관심을 갖고 공부를 시작하고 있습니다.
여튼 1장에서는 auto를 런타임 시점에 결정하기 위한 형식 연역규칙에 대한 설명이 언급되어 있습니다.
이에 대한 자세한 내용은 검색하시면 많은 블로그에서 책의 내용을 그대로 설명하고 있습니다. (이래도 되나?)
근데 읽으면서 배열에 대한 참조를 언급하는 도중 포인터로의 붕괴라는 말이 언급되더군요. 무슨말이지?
구글에서 한글로는 검색해도 나오지 않았습니다. 이를 표현하는 우리말이 따로 있는진 모르겠지만
여튼 그래서 영어로 pointer decay를 검색하니 역시 스택오버플로우 사이트에 상세히 설명되어 있었습니다.
정리해보자면 배열은 포인터가 아니라는 점입니다.
std::array, std::vector는 런타임 시점에 특별히 쓰일 수 있는 stl이지만
내장 배열은 그렇지 않습니다. 컴파일 시점에 크기가 정해진 후 컴파일러는 이 배열과 그 크기를 항상 갖고 있습니다.
소멸하지도 않죠. 그러기에 스택영역에 저장됩니다.
(VLA:variable Length Array라 하여 const int형에 한해선 내장배열의 크기를 선언할 순 있지만 const inst의 r-value가 상수로 정해져 있지
않은 이상은 되지 않습니다. 다만 이는 표준이 아니기에 권장하지 않는 방법이라 하는군요
http://stackoverflow.com/questions/16588265/why-am-i-being-allowed-to-use-a-const-qualified-variable-as-an-array-size-in-c
)
하지만 포인터는? 런타임 시점에 그 포인터값이 저장되기에 힙영역에 저장됩니다.
다시말해
const int *p = ary;
와 같이 배열이름으로 포인터 주소를 받는다 한들
컴파일러는 p가 가르키는 배열의 시작주소만 알고 있을 뿐
그 크기에 대한 정보는 알지 못합니다.
그리고 이를 Pointer Decay (arrays "decay" into pointers) 라고 지칭합니다.
이를 해결하기 위해선 결국 reference(&)를 이용하는 방법밖에 없으며 이에 대한 설명은
http://stackoverflow.com/questions/1461432/what-is-array-decaying
http://web.archive.org/web/20081208122434/http://www.transcendentaxis.com/dthompson/blog/archives/9
에 자세히 나와있습니다.
(단, 동적배열은 런타임 시점에 크기가 정해지기 때문에 컴파일러가 배열의 크기정보를 갖고 있지 못합니다.
다시말해 정적배열 사용을 전제로 설명합니다)
설명을 보면 나와있지만 포인터붕괴때문에 보통 함수로 배열주소를 넘길 때 size_t로 크기를 같이 넘깁니다.
하지만 이러한 낭비 없이 reference를 이용하면 간단히 해결된는 이야기입니다.
물론 표현이 복잡해지는 단점이 있지만 함수 인자의 수는 되도록 줄이는게 좋기때문에 충분히 사용가치가 있는것 같습니다.
설명중 틀린 부분이 있으면 지적 부탁드리겠습니다. (_ _)
'프로그래밍 > C C++' 카테고리의 다른 글
effective stl item2 : Beware the illusion of container-independent code (0) | 2017.11.12 |
---|---|
effective stl item1 (choose your containers with care) (0) | 2017.11.09 |
깊은복사 예제 (0) | 2017.05.18 |
함수포인터 이용하기 (0) | 2017.03.06 |
c++11 aliases와 template 그리고 header file (0) | 2017.02.27 |
- Total
- Today
- Yesterday
- Codejam
- C language
- 알고리즘
- 이루마
- 악보
- 문자열
- Pointer
- 중국
- 사천
- 중국여행
- compile
- 정규표현식
- Algorithm
- STL
- link
- python
- peram jam
- yiruma
- linux
- kernerl
- cpp
- Spring
- 피아노
- printf
- 카카오 공채
- 드럼
- C++
- 여행
- regex
- 코드잼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |