STL(Standard Template Library)의 궁금한점...

coco의 이미지

:roll: 안녕하세요?

C++의 STL에 관한 궁금증 몇가지를 물어 볼려고 이렇게 글을 올립니다.
STL을 공부하다 보니 잘 알고 활용하면, 코드의 재사용성 및 안정성, 그리고
성능향샹 면에서도 좋은거 같아서 이렇게 문의를 드립니다.

1. 실제 프로젝트에서 c++ STL을 많이 사용하나요?

2. STL을 공부할려고 책을 찾아보니 국내 서적은 2권인가 있던데, 좋은 책이나
좋은 관련자료 있는 사이트 있으면 추천좀 해주세요.

감사합니다.

cho's의 이미지

wowbook에 서평이 있습니다.
감히 저의 경우에서는 이 책이 최고다 라고 말하고 싶네요.
서평과 목차를 보시면 어느 정도 자신이 찾는 책인지 아실수 있을겁니다.

girneter의 이미지

책은 다른 분들이 소개 많이 해 주실테고
실제 쓰느냐...

사실 전 쌩초보라서 제대로 알지도 못하고
회사의 고수분이 쓰신 코드를 보면서 공부했슴다.
그 분도 STL 을 제대로 공부하고 쓰신건 아니고
어디서 슬쩍 보신걸 사용하신 것이었는데...

첨 봤을 때 정말 충격적이었습니다.
뭔가 족쇄를 차고 있다가 그걸 풀어버린 기분이랄까?

다른 건 몰라도
map 은 정말 유용하게 쓸 수 있을것 같습니다.
Associative array 라는 개념으로 사용할 수 있는데
임의의 값( 아무 숫자나 string, class 까지 가능 )을
index 로 사용하여 배열처럼 쓸 수 있을 뿐만 아니라
iteration, insertion, deletion 등도 아주 간단하게 이루어집니다.
아주 편리하게 쓸모가 많지요. 흐흐

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

realian의 이미지

현재 통신시스템 제작하는 회사에 있습니다.
대부분의 정보 저장 및 관리는 STL을 사용합니다.
linked-list 이런거 직접 구현 절대 안합니다.

deque, map 등등 쓰고 있습니다.

국내 서적중에 좋은 책이라 할 수 있는 책은
1. STL 튜토리얼.레퍼런스 가이드 (정승진/인포북) 하고
2. 이팩티브 STL (곽용재/인포북) 이 있습니다만

처음 배우는 사람이 시작하기에 좋은 책이라고 말하기는 조금 힘들지도 모르겠습니다.

책은 잘 나왔고 번역도 훌륭하니 (2번책은 최고의 번역 품질 및 사후관리를 자랑합니다..)
두권 다 보시면 좋을 듯 합니다.

* 근데 코드의 재사용성.. 재사용해 본 기억은 없네요..
다만 메모리 관리 같은거 좀 속편해지긴 했습니다.

..........No Sig.........|
-------------------+

iamslash의 이미지

STL을 조금씩 써 보시면 알겠지만 편리하기 때문에
실제 프로젝트에서도 많이 사용합니다.

저같은 경우는 unix 와 windows 에서 동시에 실행되는 데몬들을 주로 제작하는데 STL만큼 좋은 대안이 없었습니다...
저는 주로stlport 것을 씁니다.
http://www.stlport.org

맹고이의 이미지

주제와 조금 벗어나는 질문입니다만...

템플릿 클래스 멤버함수의 정의는

헤더파일에 하는 것이라고 어디선가 읽었는데

그게 정석인가요? 그렇게 하면 구현한 소스가 다보일것 같은데

실제로도 헤더파일에 정의를 하나요...?

불량청년의 이미지

개인적일 수도 있고 뻔~한 얘기 일 수 있지만, 성능에 영향을 미치는 P/G라면

절대 STL을 쓸 수 없습니다. 또한 한정된 메모리를 갖고 코딩을 해야 하는

상황이라면 더더욱이겠죠.

예전 프로그래밍 게시판을 보시면 포인터와 STL 속도 구현한 소스가 있을

껍니다. 함 보시길...

실제 회사에서도 많이 쓰더군요. 학교 다닐 땐 말로만 들었지, 회사 들어와서

첨 써봤습니다. ㅡ,.ㅡ; 윗분 말씀대로 정말 충격이였죠. 후후후

일일히 linked-list 구현할려고 겔겔 거리느니, 정말 한줄이면 되는 STL을

쓰죠. 다만, 위에서도 말했듯이 속도에선 좀 그런거 같더군요.

이부분에 대해선 여러 의견들이 있는것 같습니다. ㅡ,.ㅡ;

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

kihongss의 이미지

이펙티브 STL은 재밌게 볼만하던데,
STL 튜토리얼 레퍼런스 가이드는
저만 느끼는 건지 좀 지루한면이 있습니다. -_-;
그래도 번역서 중에는 대안이 없으니 참고 보셔야죠.
어느정도 STL에 대한 감이 잡히신다면
Accelerated C++을 보시길...
요즘 C++ 기초 서적은 이렇군요~
자바 기초서들이 예제로 콜렉션 객체를 막 쓰듯이
초보서임에도 불구하고 STL을 그냥 아무렇지도 않게 사용합니다.
감동입니다. ^^;

jj의 이미지

제가 STL을 직접 써보진 못해습니다만, STL 컴파일 타임에 적용되는것 같은데 실행시간에 나쁜 영향을 준다는 것은 언뜻 이해가 안됩니다. 속도가 어느정도 느려지길래... 경험해보신분들의 의견을...

--
Life is short. damn short...

cedar의 이미지

맹고이 wrote:
주제와 조금 벗어나는 질문입니다만...

템플릿 클래스 멤버함수의 정의는

헤더파일에 하는 것이라고 어디선가 읽었는데

그게 정석인가요? 그렇게 하면 구현한 소스가 다보일것 같은데

실제로도 헤더파일에 정의를 하나요...?

템플릿 멤버함수 뿐만 아니라, 템플릿을 사용한 모든 코드는
헤더파일에 작성해야 합니다.
템플릿 자체는 실제 코드가 아니라, 컴파일러가 컴파일 타임에 읽어서 코드를 생성해내는 틀(template)에 불과하므로 바이너리 형태로 만드는 것은 불가능합니다.
그러므로 템플릿 라이브러리는 항상 헤더파일 형태로만 존재하므로 라이브러리 사용자에 모든 코드가 공개되지요. 그래서 대부분 무료인 경우가 많지만, 상용 라이센스인 경우도 있습니다.

cedar의 이미지

jj wrote:
제가 STL을 직접 써보진 못해습니다만, STL 컴파일 타임에 적용되는것 같은데 실행시간에 나쁜 영향을 준다는 것은 언뜻 이해가 안됩니다. 속도가 어느정도 느려지길래... 경험해보신분들의 의견을...

tacstar wrote:

개인적일 수도 있고 뻔~한 얘기 일 수 있지만, 성능에 영향을 미치는 P/G라면
절대 STL을 쓸 수 없습니다. 또한 한정된 메모리를 갖고 코딩을 해야 하는
상황이라면 더더욱이겠죠.

글쎄요, STL은 수년간에 걸쳐 많은 고수들의 손길을 거쳐서 만들어진 라이브러리입니다. STL의 각 컨테이너와 알고리듬의 특징을 완전하게 이해하고 제대로 사용한다면 평범한 프로그래머가 고생해서 만든 코드보다 훨씬 세련되고 효율적인 코드가 만들어집니다.
물론 STL은 일반적인(generic) 상황에 모두 적용되도록 만들어진 것이므로, 특수한 상황에서는 느릴 수 있습니다. 템플릿 라이브러리는 유사한 코드를 여러번 찍어내는(inlining) 역할을 하므로, 코드가 중복되어 프로그램 크기가 지나치게 커져버리는 코드 비대화(code bloat) 문제가 발생합니다. 즉, STL은 크기 최적화는 거의 무시하고, 속도 최적화에만 신경쓰는 특징을 가지고 있습니다.
프로그램 크기가 지나치게 커지면, 최초 로딩시간이 느려지고 캐쉬의 적중률(hit ratio)이 낮아지므로 속도가 오히려 낮아질 수 있죠.
이러한 문제점은 함수 객체 대신 함수 포인터를 사용하여 인라이닝(inlining)을 피하는 방법(속도 최적화와는 반대로)으로 어느 정도 해결할 수 있습니다.
임베디드 환경과 같이 메모리가 한정된 환경에서는 컴파일러가 ANSI C++을 지원한다 하더라도 STL을 사용하지 않는 것이 일반적입니다.

그리고 문자열 타입인 std::string은 원래 STL이 아니었다가 C++ 표준 제정 과정에서 STL에 포함된 것입니다. 견고성(robustness)보다 효율성(effectiveness)만을 추구하는 다른 STL 컨테이너와는 달리, 견고성을 보장하는 특징이 있기 때문에, 견고성을 거의 고려하지 않는 ANSI C의 문자열 처리 함수보다 느립니다.
고속의 문자열 처리를 위해서는 C 방식으로 char 포인터를 직접 다루시던가, 아예 인라인 어셈블리를 사용하실 것을 권합니다.

realian의 이미지

몇분이 지적해 주셨듯이 STL 튜토리얼,레퍼런스는 무턱대고 보기엔 좀 따분하더군요..
그렇다고 이팩티브 STL을 읽자니 이건 좀 뭘 알아야 흥미있을 내용이고..

Accelated C++ (맞나요?) 는 아직 안 봤는데 많이 추천들 해 주시는 거 같군요..
뭔가 간단한 예제라든가 크지 않은 규모의 프로그램 예제를 보는것도 좋을것 같군요.

특별히 STL 이라고 해서 속도를 많이 잡아먹는것 같지는 않더군요.
물론 최적화된 구조체보다야 떨어지겠지만
각 container를 얼마나 그 목적에 알맞게 사용하는가..가 문제인거 같습니다.
이펙티브 STL 에서 다루는 내용도 이런 내용이고요..

..........No Sig.........|
-------------------+

pynoos의 이미지

STL 을 사용하지 않으면, 제가 하는 프로젝트는 아마 1/3 쯤 더 연장되었을 것입니다.

수시로 바뀌는 정책 포맷들을 처리하기위해, 핸들링 하는 구조를 이미 정형화된 STL을 사용하지 않았다면, 아마 처음 구현한 뒤로 구조를 바꾸지 않으려고
필사적으로 노력하거나, 아마 괴물이 나왔을 것입니다.

하지만, vector로 했다가 set으로 했다가, vector 두개를 썼다가 map을 썼다가 하는 일들은 생각의 자유도를 한층 높여주지요.

bugiii의 이미지

한번 맛 들리면...

거의 김치 없으면 밥 못먹는 것과 비슷하지 않을까요?

제가 김치를 워낙 많이 먹어서 장모님이 김치 대기에 바쁩니다. 처가집 (장인,장모,작은처제,처남) 이 먹는 것보다 저 혼자 먹는게 더 많다는... :shock:

snaiper의 이미지

제 생각에 STL 책 중에 가장 좋은 책은 C++ Standard Library 입니다.
조슈티스가 쓴 겁니다. 번역서도 나왔으니 한번 보시면 될 겁니다.
아 번역은 걱정 안하셔도 될 겁니다. 꽤나 잘 번역했습니다. ^^

mastercho의 이미지

전 이제
STL 없이 프로그래밍은 불가능할 지경에 놓였습니다

개인적으로 국내에 나와 있는 STL 책은 다 봤습니다만은 --;

딱히 초보가 바로 보고 할만한건 없을거 같네요

C++좀 익힌후에 STL를 익혀야 진정한 맛을 느낄수 있을거라 봅니다

와우북 서평 제목에도 썼지만 ^^;

"STL를 모르고 C++를 논하는건 죄악!"!이죠

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

saxboy의 이미지

바이너리 사이즈에 민감한 프로그램의 경우라면 절대로 STL은 쓰지 마세요!

개인적인 경우지만 어느정도의 성능이 필요한 or portablility 가 중요한 서버나 엔진류는 STL을 사용하지 않습니다. 사실은 C++도 거의 사용하지 않는 편이지요. 덕분에 회사에서 쓰는 엔진을 작업하면서 STL과 최대한 비슷해지도록 C로 기본 자료구조들을 만들어놓느라고 한동안 애썼던 적이 있습니다.

단 UI의 성격이 강한 프로그램들 - 속도에 신경을 덜 써도 상관없고, 바이너리가 좀 커도 관계없는 녀석들이라면 STL을 쓰면 굉장히 편리하지요. 웬만한 프로그램을 만들다보면 기본 자료구조를 만드느라고 드는 시간이 꽤 많은데, 이런 문제를 단번에 해결해 줄수 있는 좋은 방법이 되잖아요.
오래전 이야기지만 foreach() 를 처음 알게 되었을때의 충격은 아직도 잊을 수가 없습니다.

bugiii의 이미지

속도와 이식성... 이건 STL이 추구하는 목표가 아닙니까? 물론 현실이 따라오지 못한 점도 있지만, 지금에 와서는 많이 나아졌다고 생각합니다.

저는 VC 6.0 이라는 것이 STL 에 가장 나쁜 영향을 미쳤다고 생각합니다. 이 지독하게 오래되고 제대로 구현 안된 것들이 STL 에 대한 오해를 키우고 개발자들이 사용하는 것을 꺼리게 만들었다고 생각합니다.

많이들 사용했던 (하고 있는) VC 6.0 의 STL 이 이 모양이었으니, 별로 좋은 인상을 받지 못하고 계속 째려보고 있을 수 밖에요...

코드 크기가 커지는 문제도 컴파일러가 좋아지면서 나아지는 면도 있고, 또 피할 수 있는 방법도 있지 않습니까? (어차피 덩치 큰 레코드는 자신의 컨테이너든 STL 의 그것이든 할당해서 사용할테니까요) 또 속도문제도 제대로 구현된 STL 이라면 그 자체의 속도는 손수 만든 것 이상의 결과를 보여준다고 봅니다. 메모리 할당의 속도 문제는 어느쪽이든 마찬가지일테구요.

STL 을 제대로만 (정말 제대로) 사용할 수 있다면, 오히려 성능과 이식성을 보장 받으면서 생산성을 높일 수 있고 가독성을 높일 수 있는, 프로그래머에게 있어서 없어서는 안될 중요한 구현 도구라고 생각합니다.

저는 지금의 C++ 프로그래머라면 STL 을 전향적으로 (이건 일본말이라네요 -> 적극적, 진취적으로) 도입해야 할 때라고 봅니다.

snaiper의 이미지

다 좋습니다만..주의해야 할 것은 크기도 크기지만 STL 도 사람이 만든 이상 반드시 버그가 있기 마련입니다. 이것을 주의하라는 겁니다. 제가 아는 분도 STL 버그 떄문에(좀 예전이긴 했습니다만.) 프로젝트까지 망친 일이 있었다고 하니 약간의 경계를 해야할 필요는 있을 것 같습니다.( STL 버그인 줄도 모르고 있다가...끝나고 나서 알았다는 군요)

bugiii의 이미지

최소한 저보다는 잘 하시는 분들이 만든 것이니, 그리고 어느정도 성숙되가는 단계이므로, 그래서 진취적이라는 단어를 사용한 것입니다.
자기가 만든 것이 아니라서 버그가 있어서 곤란했다고 한다면... 저도 할 말은 없습니다만, 제 경우에는 자신이 만든 것도 똑같은 기준을 적용할 수 있다고 생각합니다. 언젠가는 컴파일러, OS 탓을 하지말라는 말이 STL 에도 적용될 날이 오겠죠... :wink:

mastercho의 이미지

snaiper 이기탁님이신가요? ^^;

맞다면??? 반갑습니다 ㅎㅎ

사실 STL에서 버그났다 치더라도 디버깅으로 추적하면 다 들어나지 않는지요?

어째튼 자기가 STL 같은 자료구조를 세워놓은 것보다

벤더들이 많들어 놓은 STL이 더 믿을 만하고 버그가 없다고 생각되는건

사실입듯 보입니다 , 얼마전 gcc에서 new로 동적 메모리 할당하는데

컴파일러에서 최적화?에러가 난듯 보이는게 얼마전에 발생했었습니다만은

이런식으로~~~~.........

STL를 못믿는다면 -_-; 윈도우 운영체제나 리눅스 유닉스 운영체제에서 제공해주는 API 환경도 역시 믿을만한게 되지 못하는가 싶습니다 --;

일단 믿고 쓰고 최악인 상황일때는 한번 , 의심은 해봐야겠죠 ....

그래도
자기가 만든 클래스나 라이브러리보단 안전할거라고는 봅니다
--;
[각 OS에 맞는 컴파일러벤더가 각각의 OS에 맞겠끔 최적화및 안정성 테스트를
다했을테니까요, 이들 보다 프로가 아닌 이상,혹은 시간이 남아돌지 않는 이상
STL은 절대 선입니다 ㅎㅎ]

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

죠커의 이미지

snaiper wrote:
다 좋습니다만..주의해야 할 것은 크기도 크기지만 STL 도 사람이 만든 이상 반드시 버그가 있기 마련입니다. 이것을 주의하라는 겁니다. 제가 아는 분도 STL 버그 떄문에(좀 예전이긴 했습니다만.) 프로젝트까지 망친 일이 있었다고 하니 약간의 경계를 해야할 필요는 있을 것 같습니다.( STL 버그인 줄도 모르고 있다가...끝나고 나서 알았다는 군요)

컴파일러와 STL 라이브러리를 정확히 알려주셔야 다른 분들께 실질적인 도움이 되지 않을까 싶습니다. :-)

saxboy의 이미지

Quote:

저는 VC 6.0 이라는 것이 STL 에 가장 나쁜 영향을 미쳤다고 생각합니다. 이 지독하게 오래되고 제대로 구현 안된 것들이 STL 에 대한 오해를 키우고 개발자들이 사용하는 것을 꺼리게 만들었다고 생각합니다.

옙... 이건 절대적인 진실입니다. :D
제가 STL을 꺼리게 된 가장 큰 이유가 VC++ 이라는 녀석이지요. 요놈이 쓰는 STL이야 원체 다들 꺼리기로 유명하니 어쩔 수 없지요. VC++에서 컴파일한 바이너리가 10메가가 된 것을 보고 한번 기겁했던 적이 있습니다. :shock:
덕분에 크로스 컴파일이 되는 코드를 만들어야 하는 입장에서는 현실적으로 STL을 도입하는 것이 <불가능>하다는 뜻이지요.

하지만 STL은 역시 편리하지요. MFC의 어설픈 리스트따위와 비교나 할 수 있을까요.

snaiper의 이미지

저도 알려드리곤 싶지만 저도 경험담을 듣긴 했지 어떤 종류의 것인지를 듣지 못했습니다. 그분이 윈도프로그래머이고 예전이라고 하는 걸 봐서는 최소한 VC6 STL 이거나 그 이전 버전이 아닐까 생각합니다.( 그러고 보니 그전이나 6 버전이나 STL 은 바뀐게 없군요)

그리고 신뢰성에 대해서는 100% 신뢰했으면 좋겠습니다만, 그런 가능성은 없고 90%는 신뢰하고 써야죠. 뭐 심심치 않게 데브피아에 STL로(VC++ 쪽입니다. 최근에 올라온 버그중에 2003 버전에 들어간 것도 있군요) 버그 리포트가 올라오는데..몇몇개는 신뢰성이 안가지만 한 두개는 보니 어느 정도 인정된 버그인거 보니..심심한 대로 버그 패치는 반드시 해야 할 겁니다.

궁금하신 분은 데브피아 자게란에 가셔서

31597 노영선(roh0sun) 2003-07-18 398 VC++ 2003 STL의 vector<bool> 버그(15)

라는 글을 보시면 됩니다.

ps. 해진님 OS API 도 가끔 못 믿는 경우가 있습니다. 제대로 만들었는데도 불구하고 되었다 안되었다하는 황당한 버그도 볼 수 있지요.

cedar의 이미지

M$ VC++에 기본 설치된 STL보다는,
STLport를 설치해서 쓰실 것을 권합니다.
호환성도 이쪽이 더 높고, 표준 STL에서 지원하지 않는 SGI STL 특유의 편리한 기능을 쓸 수 있습니다. 반복자의 디버깅 모드도 디버깅시 상당히 편리하지요.

cdpark의 이미지

snaiper wrote:
궁금하신 분은 데브피아 자게란에 가셔서

31597 노영선(roh0sun) 2003-07-18 398 VC++ 2003 STL의 vector<bool> 버그(15)

라는 글을 보시면 됩니다.

https://www.dinkumware.com/support.html

이 버그인가요? (회원제 게시판의 글이라 더 궁금증만 키우네요. ^^)

winner의 이미지

vector<bool> 에 대한 문제는 유명한 문제이죠.
표준화 위원회의 실패가 표준에서 제거되지 못하고 남아버렸다나요?

STL 의 요구사항을 모두 만족하지 못한다고 합니다.
Effective STL 에서는 vector<bool> 보기를 돌같이 하라 라는 항목이 있죠.
bool 의 배열이 필요하다면 deque<bool> 을 쓰셔야 합니다.

또다른 방법으로는 bitset 이 있는데 이것도 STL 의 요구사항은 만족시키지 않습니다만 그 자체로 유용한 library 로 보입니다. 적어도 vector<bool> 의 문제를 일으키지 않는 것으로 압니다.

이 문제를 빼 놓고는 STL 자체의 문제로 보이는 점은 아직 없는 것으로 압니다.
나머지는 platform 의 문제일 겁니다.

Visual C++ 6 의 STL 은 악명이 높죠. 하지만 .NET 으로 오면서 많이 좋아진 것으로 알며 특히 .NET 2003 에서는 거의 완벽한 것으로 보입니다.

platform 의 호환성을 보실려면 boost 에 http://boost.sourceforge.net/regression-logs/ compiler test summary 를 보시는 것이 좋습니다.
사실 boost 와 platform 과의 호환성을 보기위한 test 입니다만 거의 compiler 의 호환성 test 에 가깝죠. boost 를 제작하는데에는 STL 이 내부에 쓰이는 것으로 압니다.

현재 제가 지금까지 읽은 책은 Accelerated C++, STL Tutorial & Reference Guide, Effective STL이고, C++ 기초플러스 3판(가장 처음에 읽었던 책인데... -_- )은 읽다 말았었습니다.

모두 번역서를 읽었는데 Accelerated C++ 의 번역서는 오자가 많은 편입니다. 그리고 용어대역, 문장번역의 매끄러움에서 맘에 안드는 것도 곧잘 보이고요. 용어가 일관성있게 번역이 안 된 부분도 보이곤 합니다.

곽용재씨가 감수를 봤다고 해서 잔뜩 기대를 했는데 기대에 영 못 미쳤죠...
Accelerated C++ 는 기본입문서인데다 구성방식도 기존의 문법흐름으로 하는 방식과는 다른데 번역이 이래서 정말 맘에 안 들었습니다.
이런 책이야 말로 편역도 필요하는 등 번역이 중요한데 말이죠.
하지만 C++ 책을 이미 한권이상 읽으셔서 C++ programming 익숙하시다면 문제는 없으리라고 봅니다. C++ 는 익혔지만 좀더 C++ 로 하는 programming 이란 것이 무엇인지를 알려주기에 이미 아는 사람도 쓸모가 있거든요.

STL Tutorial & Reference Guide 는 딱딱하다는 평이 많은데 개인적으로는 잘 정리되어 있는 책이라고 생각합니다. Reference 는 후반부에 개제되어 있는데 Tutorial 역시 Reference 식 Tutorial 이라....
저자들이 STL 제작진이라... 그들이 STL 을 잘 알기 때문인지... 그런 식이라... 용어도 좀더 학술적인 용어가 많구요. 전산학을 들었고(혹은 듣고 있고), C++ 기본언어도 아는 사람들에게 적절합니다.

Effective STL 은 어찌보면 당연한 소리를 합니다만 또한 기억해둬야 할 만한 항목이 많습니다. 정말 쓸만한 technic 도 있죠. 특히 vector(string 도 됩니다) 의 swap 을 사용한 memory 할당해제는 잘 배워서 써먹었죠. 입문서는 아니기에 C++ 기본언어, STL 둘다 어느정도 알고 있어야 합니다.

C++ 기초플러스는 2000년에 샀건만 아직도 다 안 읽었습니다. 이것은 제 게으름 외에 핑계댈 것이 없는데 하여간... STL 은 후반부에 조금 다루는 정도입니다. 이번에 출간된 번역 4판은 STL, string 을 좀더 보강했다고 들었습니다.
역시 C++ 입문서이다보니 전면적으로는 다루지 않는 것 같습니다.

cedar의 이미지

cdpark wrote:
snaiper wrote:
궁금하신 분은 데브피아 자게란에 가셔서

31597 노영선(roh0sun) 2003-07-18 398 VC++ 2003 STL의 vector<bool> 버그(15)

라는 글을 보시면 됩니다.

https://www.dinkumware.com/support.html

이 버그인가요? (회원제 게시판의 글이라 더 궁금증만 키우네요. ^^)

데브피아는 패스포트 로그인 방식을 지원하기 때문에 MSN 사용자라면 가입시 별도의 개인정보를 입력하실 필요는 없습니다.
그래도 귀찮으신 분들을 위해 노영선님의 글을 대신 퍼드리죠. :)

노영선(roh0sun) wrote:

아시죠? VC++2003에 포함된 STL이 최초(미확인)로, 표준에 100% 부합하는 STL 구현이라는 거..

Dinkumware에서 100% 표준 구현이라고 자랑을 하더니 황당한 버그가 있더군요.
http://groups.google.com/groups?hl=ko&lr=&ie=UTF-8&oe=UTF-8&threadm=uCQ3aXnODHA.3236%40TK2MSFTNGP10.phx.gbl&rnum=3&prev=/groups%3Fq%3Dvector%2Bbool%2Bgroup:microsoft.public.vc.stl%26hl%3Dko%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26group%3Dmicrosoft.public.vc.stl%26selm%3DuCQ3aXnODHA.3236%2540TK2MSFTNGP10.phx.gbl%26rnum%3D3

저기 가서 보시면 라이브러리 제작자인 P.J. Plauger가 다음과 같이 답변을 합니다.

P.J. Plauger wrote:
Yes, it's a bug.

헐헐...

여기보면 버그 패치하는 방법도 나와있으니 혹시 vector<bool> 쓰실 분은 참고하시길.

저는 메모리 사용량을 따져야 하는 환경을 경험해보지 못해서, vector<bool> 같은 비트 필드는 안 써봤죠.

참고로, 버그 내용은 다음과 같습니다.

#include <vector> 
int main(int argc, char* argv[])
{
  std::vector<bool> v(32, true);
  v.back() = true; // 여기서 액세스 위반이 발생하는 황당한 버그죠.
  return 0;
} 

위에 인용한 대로, 노영선님의 글은 winner님이 제기한 문제를 얘기하는게 아닙니다.

winner wrote:

vector<bool> 에 대한 문제는 유명한 문제이죠.
표준화 위원회의 실패가 표준에서 제거되지 못하고 남아버렸다나요?

STL 의 요구사항을 모두 만족하지 못한다고 합니다.
Effective STL 에서는 vector<bool> 보기를 돌같이 하라 라는 항목이 있죠.
bool 의 배열이 필요하다면 deque<bool> 을 쓰셔야 합니다.

이것은 VC++2003에 있는 vector<bool>이 아예 사용불가능하다는 의미입니다(위의 뉴스그룹에 있는 답글대로 소스를 직접 수정하면 사용가능하겠네요.). ANSI 표준에 있는 규약 자체를 준수하지 못한다는 뜻이죠. 딩컴웨어의 "표준에 100% 부합하는 STL 구현"이 '뻥'이라는 예 중의 하나입니다.

winner님 말대로 vector<bool>은 쓸모가 거의 없습니다만, STL 컨테이너가 아니라는 치명적인 문제점을 잘 숙지하고 사용한다면 극히 일부의 예외적인 경우에 bitset 대신 쓸 수 있습니다. 또한 프록시 기반 컨테이너 클래스(물론 STL의 컨테이너 조건에는 적합하게 하는 것은 불가능합니다만)를 제작하는 데 참고하기 위한 가장 모범적인 소스코드라고 평가할 수 있습니다.(이것은 스마트 포인터를 제작하는데 auto_ptr의 소스코드가 기반이 되는 것과 마찬가지이죠.)

winner의 이미지

cedar 님 감사합니다.

혹시나 했는데 역시나 였군요.

역시 잘 모르는 거 아는 척 하면 안된다니까... -_-..

설명 감사합니다.
proxy 기반 container 는 아직 공부가 미숙해서 모르겠습니다만(이름만 들어봤습니다...) vector<bool> 이 모범적이라고 할 만한 것이었는지는 처음 알았네요..

사실 위의 STL 에 문제가 있을 수 있다는 소리는 STL implementation 을 말하는 것인가 보군요... 그렇다면 충분히 문제가 있을 수 있겠죠.

죠커의 이미지

snaiper wrote:
저도 알려드리곤 싶지만 저도 경험담을 듣긴 했지 어떤 종류의 것인지를 듣지 못했습니다. 그분이 윈도프로그래머이고 예전이라고 하는 걸 봐서는 최소한 VC6 STL 이거나 그 이전 버전이 아닐까 생각합니다.( 그러고 보니 그전이나 6 버전이나 STL 은 바뀐게 없군요)

그리고 신뢰성에 대해서는 100% 신뢰했으면 좋겠습니다만, 그런 가능성은 없

서비스팩 안깐 VC6는 STL뿐만 아니라 단순한 탬플릿 사용에도 문제가 있더군요. 서브스팩 깔고 STLPort깔고 쓰고 있습니다. :-)

bugiii의 이미지

Quote:
이것은 스마트 포인터를 제작하는데 auto_ptr의 소스코드가 기반이 되는 것과 마찬가지이죠.

auto_ptr 은 스마트 포인터와는 별개로 취급해야 한다고 생각합니다. 위말을 그대로 받아들였다가는... (말 자체가 틀렸다는 것이 아니라 오해해서 남용할 소지가 있다는 것)

그리고 vector<bool> 을 프록시의 전형이라고 할만큼 auto_ptr 이 스마트 포인터와 유사한 것인가는 조금... :wink:

jj의 이미지

C++ 한번 제대로 배워볼까 말까 참 고민이네요.

다른사람들 보는 책을 슥 펼쳐보면, 참 괴물같은 언어라는 생각이 듭니다. 엄청난 힘을 가지고 있지만... effective xxx 류의 책들을 볼때면 특히 그런생각을 피할 수 없죠.

하지만, STL은 정말 좋은것 같습니다. Java를 선호하는 편인데, 자바의 Object기반의 방법들은 정말 짜증나죠. 특히나 타이핑이 길어질때... 얼렁 template가 추가된 Java가 널리 퍼지기를...

--
Life is short. damn short...

steinway17의 이미지

하.. 오늘에야 처음으로 글을 쓰는군요..;;

어쨋든.. 저는 게임개발자 이구요. STL에 대해서는 Meyers의 EffectiveC++을
보고 처음 접하게 되었어요. 참 좋더군요. 후훗^^; 여러 컨테이너들을 포함해서
알고리즘에.. 오토포인터에.. 안쓰시는분들도 한번 써보는게 좋을꺼 같더군요.
J모 언어에나 있는 줄 알았던 것들이 C++에 있으니 얼마나 좋던지..

윗글 중에 보니.. 엄청 느리다고 하시는데 혹시 어느 제품을 사용하시는지..
VC++에 기본적으로 깔려있는 STL은 꽤나 문제점이 많구요.(딩컴웨어라는 회
사 껀데 홈페이지에 가면 최신 STL을 받을 수 있다고 합니다.) sgi사의 STL 깔으
시면 만족하면서 사용하실껍니다. 그리고 그렇게 느린 라이브러리를 누가 만드
는지 참 의심스럽군요. 사용방법을 잘 모르시는건 아닌지.. Effective STL 같은
책을 보면 도움이 되실듯.

그럼.

cedar의 이미지

bugiii wrote:
Quote:
이것은 스마트 포인터를 제작하는데 auto_ptr의 소스코드가 기반이 되는 것과 마찬가지이죠.

auto_ptr 은 스마트 포인터와는 별개로 취급해야 한다고 생각합니다. 위말을 그대로 받아들였다가는... (말 자체가 틀렸다는 것이 아니라 오해해서 남용할 소지가 있다는 것)

그리고 vector<bool> 을 프록시의 전형이라고 할만큼 auto_ptr 이 스마트 포인터와 유사한 것인가는 조금... :wink:

음... 오해의 소지가 있겠네요. '기반' 대신 '참고' 정도로 수정해서 이해하시기 바랍니다.
그리고 auto_ptr도 간단한 스마트 포인터의 일종입니다. 스마트 포인터가 가져야할 인터페이스는 모두 정의되어 있지요. 이보다 더 강력한 스마트 포인터를 만들때도 auto_ptr과 동일한 인터페이스를 지원해야 합니다. 즉, auto_ptr은 스마트 포인터의 인터페이스가 이러해야 한다는 것을 규정하는 역할을 합니다.

bugiii의 이미지

평범한 (기준이나 표준이 없어서 딱히 표현할 단어가...) 스마트 포인터라면 가져야 할 특징이 (인터페이스 말고 행동) auto_ptr 에 없기 때문에 혹시라도 STL 에 진입하시는 분들이 오해하실까봐 말씀드린것입니다.

정확한 문구는 찾아봐야겠는데요... (표준위원회에서 금지한 걸로 기억합니다.)auto_ptr 를 컨테이너에 담지 못하는 문제 때문이라도 둘은 구분해야만 한다고 알고 있습니다.

Effective C++ 에서는 auto_ptr 같은 것을 스마트 포인터 범주에 넣어서 말을 하지만
Effective STL 에서는 auto_ptr 은 스마트 포인터와 거리가 멀다라고 적혀 있는 걸로 기억합니다.

인터페이스 측면에서는 당연히 그렇지만, 사용하는 사람 입장에서는 그 행동에 유의할 필요도 있지 않을까요?

잘못된 것이 있다면 바로 지적해 주세요~~~

cedar의 이미지

bugiii wrote:
평범한 (기준이나 표준이 없어서 딱히 표현할 단어가...) 스마트 포인터라면 가져야 할 특징이 (인터페이스 말고 행동) auto_ptr 에 없기 때문에 혹시라도 STL 에 진입하시는 분들이 오해하실까봐 말씀드린것입니다.

정확한 문구는 찾아봐야겠는데요... (표준위원회에서 금지한 걸로 기억합니다.)auto_ptr 를 컨테이너에 담지 못하는 문제 때문이라도 둘은 구분해야만 한다고 알고 있습니다.

Effective C++ 에서는 auto_ptr 같은 것을 스마트 포인터 범주에 넣어서 말을 하지만
Effective STL 에서는 auto_ptr 은 스마트 포인터와 거리가 멀다라고 적혀 있는 걸로 기억합니다.

인터페이스 측면에서는 당연히 그렇지만, 사용하는 사람 입장에서는 그 행동에 유의할 필요도 있지 않을까요?

잘못된 것이 있다면 바로 지적해 주세요~~~

스캇 마이어스의 두 책에서 auto_ptr에 대한 평가를 상반되게 하고 있어서 오해하실 여지가 크죠.

한국어판 Effective STL, 항목 8 wrote:

항목 50을 참고하면, STL과 잘 섞어 쓸수 있는 스마트 포인터를 구할 수 있는 방법을 알수 있습니다. 단언하건대, auto_ptr은 이런 스마트 포인터와는 거리가 멉니다. 전혀요.

즉, auto_ptr은 STL 컨테이너나 배열의 원소로는 쓸 수 없는 스마트 포인터일 따름입니다. '소유권(ownership)'이란 것이 복사되지 않고 이동만 되기 때문에 이런 문제가 생기는 것이지요. 그래서 아예 표준에서는 COAP(Container Of Auto_Ptr, 스마트 포인터의 컨테이너)가 컴파일되지 않도록 막아놓은 것입니다.
STL 컨테이너의 원소로 사용할 수 있는 '제대로 된' 스마트 포인터는 auto_ptr보다 코드가 훨씬 복잡하기 때문에 그만큼 오버헤드도 큽니다.
(C++ guru인 스캇 마이어스조차 버그 없는 스마트 포인터를 만들지 못했습니다. More Effective C++에 있는 스마트 포인터는 쓰지 마세요. boost::shared_ptr을 추천합니다.)
이런 용도가 아니고, auto_ptr의 한계 내에서만 작업하는 경우라면 그냥 auto_ptr을 쓰는 쪽이 오버헤드를 줄일 수 있습니다.
auto_ptr은 표준에서 제공하는 비교적 간단한 스마트 포인터로서, 기능에 제한을 가지고 있다는 점을 이해하시기 바랍니다.
참고로 boost 라이브러리에 있는 스마트 포인터중 boost::scoped_ptr은 auto_ptr보다 더 기능을 제한했습니다. 아예 소유권 이전 기능 자체가 없는 간단한 스마트 포인터지요. 오버헤드가 상당히 작다는 장점이 있습니다.
bugiii의 이미지

좋은 말씀 감사드립니다. ( 이런 이라는 단어를 기억하지 못했네요. :wink: )
boost::scoped_ptr 도 감사드립니다.

verena의 이미지

일부 속도와 관련해서 혹은 바이너리 크기와 관련해서 STL을 사용을 자제하라고 했는데,, 전 다릅니다.

사실 STL을 지원하는 플랫폼이 대부분 pc급 이상일뿐이지, 그런 환경에 맞는 STL이 나온다면 또 달라지겠죠...

이젠 속도[흔히 말하는 코드의 퍼포먼스]보단 전체적인 완성도와 효율성을 따져야 할 시기라고 봅니다.

gilbird의 이미지

jj wrote:
C++ 한번 제대로 배워볼까 말까 참 고민이네요.

다른사람들 보는 책을 슥 펼쳐보면, 참 괴물같은 언어라는 생각이 듭니다. 엄청난 힘을 가지고 있지만... effective xxx 류의 책들을 볼때면 특히 그런생각을 피할 수 없죠.

하지만, STL은 정말 좋은것 같습니다. Java를 선호하는 편인데, 자바의 Object기반의 방법들은 정말 짜증나죠. 특히나 타이핑이 길어질때... 얼렁 template가 추가된 Java가 널리 퍼지기를...

자바쪽에서 template을 적용하면 언어가 C++이 되는것 아니냐는 설이 있어서 적용을 망설인다고 들었습니다.

참고로 STL을 만든 Alexander Stepanov의 인터뷰 기사 링크를 올립니다.

http://my.netian.com/~gilbird/stl/intv1.html

http://my.netian.com/~gilbird/stl/intv2.html

cedar의 이미지

gilbird wrote:
jj wrote:
C++ 한번 제대로 배워볼까 말까 참 고민이네요.

다른사람들 보는 책을 슥 펼쳐보면, 참 괴물같은 언어라는 생각이 듭니다. 엄청난 힘을 가지고 있지만... effective xxx 류의 책들을 볼때면 특히 그런생각을 피할 수 없죠.

하지만, STL은 정말 좋은것 같습니다. Java를 선호하는 편인데, 자바의 Object기반의 방법들은 정말 짜증나죠. 특히나 타이핑이 길어질때... 얼렁 template가 추가된 Java가 널리 퍼지기를...

자바쪽에서 template을 적용하면 언어가 C++이 되는것 아니냐는 설이 있어서 적용을 망설인다고 들었습니다.

동감합니다. 자바의 탄생 배경은 기존 C++과 같은 언어의 복잡성을 배제해서 임베디드 시스템같은 제한된 시스템에서도 작동하는 VM을 만드는데 그 목적이 있지요. 템플릿과 같은 generic programming은 컴파일러 입장에서 보면 그 구현이 상당히 까다롭습니다. C++98 표준 제정이 5년이 지났건만 아직도 100% 호환되는 상용 컴파일러가 존재하지 않는 것도 이때문입니다.
C++의 철학은 컴파일러가 아무리 복잡해지고 바이너리 파일크기가 커지더라도 철저한 generic programming을 지원하여 개발자가 설계와 유지보수를 빠르고 편하게 하고(템플릿 라이브러리는 일종의 코드 생성기 역할을 합니다.), 인라이닝으로 인한 속도의 향상을 추구하는데 목적이 있지요.
만약, 자바가 템플릿을 지원한다면 임베디드 시스템에서 작동하는 JVM을 만드는 것은 요원한 일일겁니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.