2008. 7. 17. 00:24 책 정리/Effective STL
C API 들 중에 배열을 받아서 처리 하는 함수들이 많이 있다. 이 함수들에 vector와 string이 들어 갈수가 있는데, 왜 이 두 STL 만 들어가냐하면, ... 이 두 STL은 배열을 기반으로 만들어진 STL이기에, 실제로 메모리가 연속되어서 할당된 것이다.

예를 들어
std::vector v; 가 있고, 10개의 요소가 있다면, &v[0]이 그 첫번째 주소이고 size(); 함수 호출에 리턴되는 값만큼 연속적으로 쌓여 있다는 이야기이다.

여기서 주의 해야 할 것은 &v[0], size()를 넘겨서 대개는 잘 작동 하는데, 그 이유는 이 배열을 루틴 내에서 크기변경을 하지 않기 때문이다. 반대로 잘 작동 안하는것은 v의 크기가 루틴내에서 변경되기 때문이다. 또한 v에 아무 인자도 없다고 하더라고 &v[0]은 컴파일은 잘 되나, 그 결과가 .. 예측할수 없다는 점을 미리 알린다.

자... vector에 결론이 보인다. ..
배열처럼 쓸수 있지만. 루틴 내에서 v의 요소 갯수를 감소시키거나 추가 해서는 안된다는 것이다.


이제 string에 대해서 이야기 해보자. 스트링은 string[0] .. 뭐 이런것이 없기 때문에, 별도로 string.c_str()을 지원하여 char*를 뱉어낸다.

여기서 주의 해야 할 것은 c_str()은 가리킨 문자의 포인터가 아니라, 그 문자열의 사본을 가리키는 포인터를 뱉는 함수이다. 그렇기 떄문에 변경을 되어도 사본이 변경이 된것이라고 한다.(이건 좀 실험해 봐야겠는걸..)



posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요