현대적인 C ++이 더 널리 보급되고 있습니까? [닫은]


132

6-7 년 전에 C ++을 처음 배웠을 때 배운 것은 기본적으로 "C with Classes"였습니다. std::vector당신이 정말로 원한다면 배울 수있는 고급 주제였습니다 . 그리고 메모리 관리를 돕기 위해 소멸자를 활용할 수 있다고 말하는 사람은 아무도 없었습니다. 오늘은 어디에서나 RAII와 SFINAE , STL과 Boost, 그리고 Modern C ++을 볼 수 있습니다. 언어를 막 시작한 사람들조차도 거의 1 일부터 이러한 개념을 배우는 것 같습니다.

제 질문은 "최상의", 즉 여기 SO에 대한 질문과 초보자 (gamedev.net)를 끌어들이는 경향이있는 다른 프로그래밍 사이트에서만 볼 수 있기 때문입니다. C ++ 커뮤니티 전체?

현대 C ++이 실제로 기본값이됩니까? 전문가들이 작성하는 멋진 것이 아니라 "C ++의 방식"이 되었습니까? 아니면 여전히 "클래스를 사용하여 C"를 배우고을 사용하는 대신 자체 동적 배열을 작성하고 std::vector최상위 코드에서 new / delete를 수동으로 호출하여 메모리 관리를 수행 하는 수천 명의 사람들을 볼 수 없습니까?

내가 믿기를 원하는만큼 C ++ 커뮤니티 전체가 기본적으로 몇 년 동안 그렇게 많이 발전했다면 믿을 수 없을 것 같습니다. 당신의 경험과 인상은 무엇입니까?

(면책 조항 : C ++에 익숙하지 않은 사람은 C ++이 다른 언어보다 인기를 얻고 있는지 묻는 제목을 잘못 해석 할 수 있습니다. 내 질문은 아닙니다. "Modern C ++"는 C ++ 내에서 방언이나 프로그래밍 스타일의 일반적인 이름으로 책의 이름을 따서 " 현대적인 C ++ 디자인 : 일반 프로그래밍 및 디자인 패턴 적용 "그리고 나는"오래된 C ++ "대 이것에만 관심이 있습니다. 따라서 C ++의 시간이 지났다고 말할 필요가 없습니다. 우리는 모두 파이썬을 사용해야합니다;))


2
불행히도 C ++ 커뮤니티 전체가 표준 라이브러리를 사용하는 방법을 인식하고 향후 C ++ 0x 추가 기능과 함께 유사한 방법론을 사용하여 코드를 효과적으로 구현하는 데 도움이 될만큼 충분히 발전하기까지 다소 시간이 걸릴 것이라고 생각합니다. 그러나 C ++ 0x는 C ++의 인기를 높이기 위해 많은 희망을 가지고 있다고 생각합니다. 매일 많은 구문상의 불편 함이 개선되었습니다. 나는 항상 이런 것들을 사소한 것으로 생각했지만 언어를보고있는 외부 사람들에게 이것은 일반적인 불만의 원인입니다.
stinky472

15
필자의 경우 RAII 및 예외 안전과 같은 현대적인 C ++ 기술 (알렉산더 스쿠의 책을 반드시 언급 할 필요는 없음)을 이해하는 전문가 나 반복자 및 일반 알고리즘과 같은 가장 기본적인 개념을 이해할 때마다 이해하지 못하는 사람이 10 명 더 있습니다. 적어도 전문가들에 관해서는, 그들 중 많은 사람들이 알고있는 것을 배우기 위해 마감일에 너무 많이 걸리기 때문에 자체 선언 된 C ++ 전문가조차도 종종 배울 것이 많습니다. C ++ 0x를 사용하는 사람들 중 하나가되고 두려워합니다. 많이 배우고 조정해야하며 마감 기한이 있습니다.
stinky472

답변:


76

여기에 내가 진화했다고 생각하는 방법이 있습니다.

1 세대 C ++ 프로그래머는 C 프로그래머로 C 클래스를 C로 사용했습니다. 또한 STL은 아직 제자리에 없었으므로 C ++이 본질적으로 그런 것입니다.

STL이 나왔을 때, 그 진보 된 것들, 그러나 대부분의 사람들은 책을 쓰고, 커리큘럼을 정리하고, 수업을 가르치면서 C를 먼저 배웠고, 그 다음으로 C ++을 배웠습니다. 또 다른 대답에서 알 수 있듯이, 규칙적인 for 루프를 작성하는 것이 편안하다면 사용을 변경해도 std::for_each"현대적인"방식으로 일을한다는 따뜻한 퍼지 느낌을 제외하고는 많이 사지 않습니다.

이제 우리는 C ++ 전체를 사용하고 Koenig & Moo의 Accelerated C ++ 및 Stroustrup의 새로운 교과서와 같은 관점에서 지침을 얻는 강사와 서적 작가를 보유하고 있습니다. 그래서 우리는 char*그때 배우지 않습니다 std::strings.

"레거시"방법을 대체하는 데 걸리는 시간, 특히 효과에 대한 기록이있는 경우에 흥미로운 교훈입니다.


13
예. C 코더의 거대한 설치 기반으로 인해 C ++가 C와 역 호환성을 유지하는 것이 매우 현명했습니다. DOS와의 호환성을 항상 유지한다는 MS의 성공적인 전략과 매우 유사합니다. (종종 고통스러운 길이에 대한 참조 레이몬드 첸의 우수한 블로그 그들은 ...에 갔다)
j_random_hacker

2
혹시 거기에 약간의 접선이있었습니다 ... C에서 전환 한 사람들 (그러나 C 스타일의 생각을 유지 한 사람들)과 "첫 번째 취향을 유지 한 사람들"사이의 "세대 적 차이"에 대해 옳다고 생각합니다. "는 STL 이후 C ++입니다.
j_random_hacker

57

확실히 맞아요. 이 "현대 C ++"스타일로 C ++을 프로그래밍하지 않는다면 C ++을 사용할 필요가 없습니다! 당신은 C를 사용할 수도있을 것이다. "Modern C ++"는 C ++이 내 의견으로는 프로그래밍 된 유일한 방법이어야한다. 그리고 C ++을 사용하고이 "Modern"방식으로 프로그래밍 한 모든 사람들이 나와 동의 할 것으로 기대한다. 사실, auto_ptr이나 ptr_vector와 같은 것을 모르는 C ++ 프로그래머에 대해 들으면 항상 완전히 충격을받습니다. 내가 아는 한, 그 아이디어는 C ++의 기본적이고 근본적이므로 다른 방식으로는 상상할 수 없었습니다.


4
+1; "modern c ++"스타일은 자연스럽게 수행하는 방법이기 때문에 일찍 시작했습니다 (클래스에서 C를 생각하지 않는 경우).
Adam Hawes

21
"C 만 사용 하시겠습니까?" C는 강력하다.
Clark Gaebel

4
로봇은 확실히 C ++로 프로그래밍하지 않을 것입니다. 어리석지 않으며 컴파일하려고 얼어 붙습니다.
Matt Joiner

6
C가 강력한 경우 @ClarkGaebel 음, 이렇게 :)의 문제가없는 C로부터 상속에 의해 C ++를하다
legends2k

4
@rxantos, 우리는 성능을 평가할 수있는 다양한 옵션 (예 : 어셈블리 출력, 타이머, RAM 모니터 등)이 없다고 말합니다. C ++은 C와 다르지 않습니다. 의심스러운 경우 프로파일하십시오. 다른 것들은 단지 의견입니다.
underscore_d

25

Windows 3.1 시대에는 C가 표준이었습니다. C ++이 개발자 시장을 강타하고 나중에 ANSI 표준이되었을 때, 이것이 새로운 인기였습니다. 다형성을 사용하여 OOP 약어 및 일부 기본 디자인 패턴을 대중화했습니다.

이제 C # /. NET과 같이 낮은 장벽에서 항목으로 관리되는 플랫폼을 더 많이 수용하므로 C ++을 사용할 이유가 적습니다. 많은 개발자 기반이 선택을하고 솔직하게 말합시다. C ++는 초보자를위한 곰입니다. C #을 사용하면 바로 실행할 수 있습니다.

그것은 실제로 예술을 계속 연습 할 수있는 C ++ 및 다이 하드 C ++ 복음 주의자들이 필요로하는 플랫폼 만 남습니다. 이것은 "Modern C ++"로 간주되는 모든 추상화 계층을 필요로하고 원하는 커뮤니티입니다.

네, "Modern C ++"는 여러분이 말한대로 점점 더 널리 퍼지고 있다고 생각합니다. 그럼에도 불구하고 그것은 과거에 사용했던 것과는 다른 독자들에게 널리 퍼져 있습니다.


얘들 아,이 대답은 좋은 지적을합니다. C ++은 완벽하지는 않습니다. 우리 모두는 Bjarne 자신이 너무 크고 배우기가 어렵다고 불평합니다. Modern C ++가 왜 그렇게 점진적으로 등장했는지에 대해서는 동의하지 않지만 IMHO는 이렇게 큰 언어가 "순환"하는 데 시간이 오래 걸립니다.
j_random_hacker

4
그래서 당신은 더 많은 개발자들이 C #으로 향하고 더 하드 코어가 C ++에 더 많이 붙어 있다고 말하고 있습니까? (실제로 똑똑한 C # /. NET 사용자는 아니지만 덜 똑똑한 사람들이 많이 있습니다.) 어느 정도 의미가 있습니다.
David Thornley

3
나는 그것이 올바른 지적이라고 생각합니다. 물론 모든 사람에게 해당되는 것은 아니지만 대부분 선택의 여지가있는 사람들은 이미 C #이나 Java 또는 다른 언어로 갔다는 데 동의합니다.
jalf

3
사용 사례 : Windows 클라이언트가 내 DB에서 CRUD를 수행하기를 원합니다. C # /. NET 또는 C ++ / MFC를 사용 하시겠습니까? 웹앱을 원합니다 ... C # / ASP.NET 또는 C ++ / ISAPI를 사용 하시겠습니까? DirectX C # /. NET 또는 C ++ / MFC / WTL을 사용하여 간단한 "Nybbles"복제본을 원하십니까? Assembly09에서 확실히 승리 한 데모를 원합니다. 확실히 C ++ (vs. C #).
spoulson

8
더 많은 추상화 계층 또는 더 많은 다이 하드 문제인지는 모르겠습니다. 나는 그것이 뿐이다 의심 종류의 템플릿을 통해 사용할 수있는 추상화 다만, Java 또는 C #에서 사용할 수 없었던 좋아하거나이 C ++에 머물렀다 필요한 사람들 있도록.
Kragen Javier Sitaker

16

저는 STL을 사용하는 방법을 배우고 첫날부터 RAII와 좋은 C ++ 프로그래밍 방법에 대해 많은 것을 들었던 이들 중 한 사람입니다. 오늘날 C ++을 배우기 위해 가장 권장되는 책 중 일부처럼 보입니다 (가속 C ++ 및 효과적인 C ++ 시리즈 등). ) 자신의 작업을 롤업하는 대신 STL 도구를 사용하는 데 집중하고 효과적인 (또는 "현대적인") 프로그래밍을위한 많은 "규칙"을 제공합니다.

그러나 친구들과 이야기하면서 저는 일부 회사들이 여전히 "Modern C ++"가 아니라 "C with Classes"를 사용하고 있다고 언급했습니다. 어쩌면 "Modern C ++"의 저자와 사용자가 제안한 문화가 언젠가 우세 할 것입니다 :)


내가 일하는 곳에서는 클래스와 함께 C를 사용합니다. 아마도 오래 된 타이머가 많기 때문일 것입니다. 그들은 부스트는 물론 STL조차도 매우 조심스럽게 보입니다.
aneccodeal

12

나는 당신이 처음에 나쁜 경험을했다고 생각합니다.

Scott Meyers Effective C ++ 서적 을 구해야 합니다. 1999 년에 C ++을 시작하면서 분노를 일으켰고, 팀 리더는 모든 코드를 체크인하기 전에 Effective C ++ 및 More Effective C ++를 읽고 읽었습니다.

그의 조언은 대부분의 라인에 "이 사용하지 마십시오 기능을 하지만, 당신이해야하는 경우, 계속 마음에"

그의 조언을 따르면 좋은 또는 "현대적인"C ++를 쓸 수 있습니다.

그는 지금도 STL에 관한 책을 가지고 있지만 읽지 않았습니다.


나는 이것이 나의 출발점이라고 언급해야한다. 오늘 저는 STL, 부스트, RAII 및 기타 모든 것에 매우 편안합니다. 처음 경험이 얼마나 흔한 지 궁금했습니다.
jalf

9

내 C ++ 작업에서 현대적인 기능이 점점 더 많이 사용되는 것을 발견했으며 더 많은 사람들이 전화 심사 및 인터뷰에서 나에게 질문했습니다. 내가 알 수있는 한, 그들은 따라 잡고 있습니다.

나는 C ++을 클래스가있는 C와 같은 것으로 배웠다. 언어는 그 이상으로 발전했지만, 내가 읽은 책과 함께 일했던 사람들은 "오래된 C ++"에 굳게 붙어있었습니다. 사람들이 자동적으로 생각하기보다는 생각할 수있는 RAII, 나는 예외 안전 문제에 관한 초기 기사를 읽는 것을 기억합니다.

지적했듯이 이제 새로운 책이 나옵니다. 많은 오래된 것들이 여전히 관련이 있지만, 왜 분명히 나쁜 생각이 나쁜지를 설명하는 것으로 가득 차있는 것 같습니다. 유사하게, 현대 독자들은 무의식적 사고에 대한 혁명적 인 프로이트의 아이디어가 현재의 일반적인 지혜이기 때문에 얼마나 이해했는지가 어렵습니다.

Stroustrup은 Programming : Principles and Practice Using C ++ 교과서와 함께 나왔습니다 . 나는 Stroustrup의 책에서 좋은 것을 배우지 못했지만 처음 몇 장을 지나치지 않았기 때문에 그것을 샀습니다. 지금까지 내가 말할 수있는 것은 그가 시작하는 방식을 승인한다는 것입니다. 적어도 C ++을 어떻게 사용 해야하는지에 대한 좋은 소개입니다.


STL의 첫 번째 버전조차도 예외 안전하지 않았습니다.
Kragen Javier Sitaker

2
그 당시 아무도 예외 안전 코드를 작성하는 방법을 알지 못했습니다. 그것은 표준 발행 후 몇 년 동안 해결되었습니다. C ++ Report의 기사 중 일부를 기억합니다.
David Thornley

7

현재 내가 참여하고있는 프로젝트를 진행하는 동안, 상당한 기간 (10 년 이상)에 걸쳐 발전한 많은 C ++ 코드가 있습니다. 당신이 말하는 진화는 분명히 눈에 보인다. 오래된 코드는 종종 "클래스를 가진 C"-원시 포인터, char*문자열 및 관련 C 함수, 배열 등의 사용; 최신 코드는 ATL 스마트 포인터 등을 사용하여 리소스를 관리하지만 여전히 대부분의 경우 수작업으로 작성된 루프를 고수하며 반복자는 거의 보이지 않습니다. 최신 버전은 STL 컨테이너, 알고리즘,shared_ptr(핸들 등을 관리하기위한 커스텀 삭제 도구 포함), 고도로 일반화 된 함수 및 클래스 템플릿 등. 수동 평생 관리 기능이있는 원시 캡슐화되지 않은 포인터와 같은 대부분의 "클래스가있는 C"코딩 기술은 요즘 코드 검토에서 매우 눈살을 찌푸립니다. 이것으로 판단하면, 당신의 관찰은 정확한 것 같습니다.

가장 최근의 개발은 C ++ 0x 람다에 대한 유행으로 보입니다. 이는 또한 코드를 직접 코딩 할 수 있기 때문에 수작업으로 코딩 된 루프보다 표준 알고리즘을 사용하기 위해 균형을 기울입니다. 알고리즘도 마찬가지입니다.


6

나는 std :: vector가 요즘 "현대"라고 말하는 것은 아니다. 정말 기본입니다.

일반적으로 사람들은 현대적인 C ++ 스타일에 대한 경험을 쌓았으며 약간은 냉담했습니다. 간단한 예를 들자면 STL for_each는 흥미로 웠지만 실제로는 평범한 C 루프에 끔찍한 가치를 더하지 않습니다. 디버깅하기가 더 어려우며 때로는 최상의 성능을 제공하지 않습니다. 또한 현재 STL에서 기능 프로그래밍을위한 구성은 일반적으로 매우 성가신 데, 특히 ML과 같은 실제 기능 언어에서 경험이있는 경우 더욱 그렇습니다.


1
왜 벡터가 현대에 적합하지 않다고 말합니까? 기본적 임에도 불구하고 여전히 많은 사용 사례에서 최첨단 기술입니다. 근데 뭔가 기본적인 것이 현대적이지 않다고 생각하지는 않습니다. 오히려 그 반대입니다. 그러나 나는 두 번째 단락에 동의한다고 생각합니다 :)
Johannes Schaub-litb

4
그러나 이것은 일부 ppl이 for_each와 친구들을 기본적으로 모든 것에 사용하려고 시도하기 때문에 간단한 for-loop가 더 간결한 위치와 같은 것들에 대해서도-2 줄 루프를 10 줄까지 부풀어 올리는 것입니다. 난 람다 그래도 C ++ 1 배에서 사용할 수 때 더 많은 사람들의 for_each과 친구를 사용할 것으로 예상
litb - 요하네스 SCHAUB

7
기본 벡터는 정확히 포인트입니다. 항상 기본적이지는 않았습니다. 한 번, 그것은 일반적으로 매우 복잡하고 (템플릿을 사용했습니다) 비효율적입니다 (원시 배열이 아닙니다). 전문가들이 설교 할 수 있지만 많은 사람들이 믿지 않았습니다.
jalf

2
아마 std :: for_each이 당신이 말하는 것과 비교할 필요가 거의 없기 때문에 ... std :: transform? 알고리즘을 사용하면 매우 일반적인 버그 인 잘못된 루프 조건을 제거 할 수 있습니다.
Edouard A.

vector <bool>은 확실히 기본이 아닙니다 ...
Kugel

6

불행히도 제 경험 (스페인 대학)에서는 언어 자체를 고려하지 않는 것이 표준입니다. 교사와 학생이 쉽게 사용할 수 있기 때문에 프로그래밍을 가르치기 위해 가장 쉬운 언어를 사용합니다 (예 : Java). 그리고 OS 클래스 등에 C를 사용합니다.

C ++은 C에게 클래스를 제공하기 위해 아주 조금씩 (어느 코스에서든지) 도입되었습니다. 그들은 부스트 ​​또는 STL에 빠지지 않습니다. C ++의 모든 특성과 사고 방식을 지키는 것은 교사와 학생 모두에게 비용이 많이 든다고 생각합니다. 더 나은 솔루션을 제공하거나 설계하기 위해 부스트 라이브러리를 충분히 알고있는 C ++ 프로그래머는 몇 명입니까? 모든 새로운 도서관과 관용구에 관심을 가져야합니다.

그러나 내가 말했듯이, 일반적으로 프로그래밍 (특히 프로그래밍 언어)은 작업을 시작할 때 일시적인 할당 인 것처럼 보이기 때문에 너무 심각하게 고려되지 않은 것으로 보입니다. 엔터프라이즈 트리. 이곳의 많은 기업과 대학 자체는 누구나 프로그래밍을 할 수 있다고 생각합니다.

이 철학을 따른다면, 내가 아는 대부분의 사람들에게 C ++은 항상 "클래스를 가진 C"가 될 것입니다.

문안 인사,


그것의 대부분은 컴퓨터 과학에서 매우 일반적이며, 나는 그것이 나쁜 것이라고 생각하지 않습니다. (언어에 중점을 두지 말아야합니다. 가르치는 언어는 여전히 제대로 가르쳐야합니다).
jalf

+1 : "(언어에 중점을 두지 않았습니다. 즉, ARE가 가르치는 언어는 여전히 올바르게 학습해야합니다."
Jared Updike

6

내 경험상 소프트웨어 제품 / 프로젝트의 연령에 따라 크게 다릅니다. 내가 아는 대부분의 새로운 프로젝트는 최신 C ++ (RAII, STL, Boost)를 사용합니다. 그러나 10 년이 넘은 많은 C ++ 프로젝트가 있으며 거기에는 최신 C ++이 없습니다.

또한 가장 인기있는 STL 구현 중 일부는 아마도 5 년 전 (MSVC <7.0 및 GNU <3.00)까지 거의 깨졌습니다.


4

필자가 직면 한 가장 큰 장벽은 특히 크로스 플랫폼 프로젝트에서 툴체인 지원이라고 생각합니다. 몇 년 전까지, "컴파일러가 멈 췄기 때문에 x 플랫폼이 작동하려면 STLport가 필요합니다"라는 빌드 노트를 보는 것이 일반적이었습니다. 지금도 다른 버전의 BOOST에 연결된 여러 타사 종속성을 사용하려는 사람들의 문제가 있습니다. 이것은 연결을 불가능하게합니다. 다시 돌아가서 처음부터 다시 시작해야합니다.

이제 거의 모든 사람이 MSVC ++ 6 사용을 중단 했으므로 STLport 혼란이 우리 뒤에 있습니다. 그러나 TR1이 문을 열 자마자 우리는 "어떤 버전의 환경에서이를 지원하고 올바르게 구현할 수 있는지"로 돌아가고 다시 한 번 채택이 느려질 것입니다.

1992 년 C (C ++ 아님)에서 시작된 프로젝트를 진행하고 있습니다. 레거시 코드베이스에 현대적인 방식을 배포하는 것은 불가능합니다. 마찬가지로 저는 C ++ 언어의 최첨단에 훨씬 가까운 다른 프로젝트에서 작업합니다.


3

제가 많은 팀에서 "예외를 사용하고 있습니까?" 질문. 이것은 "현대 C ++를 사용하고 있습니까?"

예외를 사용하지 않으면 언어와 라이브러리의 모든 기능을 사용할 수 없습니다.

그러나 많은 오래된 코드베이스는 예외가 없으며 예외를 예상하지 않는 코드베이스 또는 사용 방법을 모르는 팀으로 예외를 묶는 것이 어렵다는 인식이 있습니다. 종종 '아니요'

내 경험상, 현대 C ++은 팀에서 그것에 대해 열정을 가지고 있으며, 아무것도 보지 못하고 그것을 밀 수있는 사람이 필요합니다. 또한 레거시 코드와 같이되기를 원하는 사람들의 반대 의견도 극복해야합니다.

오래된 C ++ 코드베이스가 매우 빨리 사라질 것이라고 생각하지는 않지만 전 세계에 5 년 전보다 열정적 인 사람들이 더 많다고 생각합니다. 그들은 5 년 전에 직면했던 것과 같은 오르막 전투에 직면했지만, 친절한 영혼을 찾을 가능성이 더 큽니다.


3

그러한 질문에 대답하기 전에 "현대"가 무엇인지에 동의해야합니다. "현대"는 잘 정의되지 않은 단어이므로 다른 사람들과 다른 것을 의미하기 때문에 이런 일이 일어나지 않을 것입니다. Alexandrescu의 책 (Modern C ++ Design)의 제목은 C ++의 특정 영역 인 Template Metaprogramming에 관한 책이기 때문에 실제로 도움이되지는 않습니다.

나를 위해 "Modern C ++"! = "Template Metaprogramming". C 외에 C ++의 기능은 다음 범주에 속한다고 말합니다.

  • 클래스 (생성자, 소멸자, RAII, 동적 캐스팅 및 RTTI)
  • 예외
  • 참고 문헌
  • 표준 라이브러리 (STL)의 데이터 구조 및 알고리즘
  • 요오드
  • 간단한 클래스 및 함수 템플릿
  • 템플릿 메타 프로그래밍

이들은 모두 거의 10 년 이상 되었기 때문에 특히 현대적인 것은 없습니다. 이러한 기능의 대부분은 유용하며 많은 사용 사례에서 직선 C보다 생산성이 향상됩니다. 훌륭한 프로그래머는 적절한 규모의 프로젝트에서 모든 것을 사용해야하지만, 그중 하나는 다른 것과 다릅니다.

템플릿 메타 프로그래밍.

템플릿 메타 프로그래밍에 대한 짧은 대답은 '아니요'입니다. 불행히도 일부 사람들에게는 책으로 인해 "Modern C ++ programming"과 동의어이지만 결국에는 해결하는 것보다 더 많은 문제가 발생합니다. C ++에서 리플렉션과 같은보다 일반적인 프로그래밍 메커니즘을 개발하지 않는 한 일반적인 프로그래밍에는 적합하지 않으며 Python과 같은 고급 언어는 이러한 사용 사례에 더 적합합니다. 그 이유와 다른 여러 가지 이유로 C ++ FQA를 참조하십시오.


6
IMHO 템플릿 메타 프로그래밍은 응용 프로그래밍에 거의 필요하지 않으며 , 가독성과 이해하기 어려운 버그로 인해 불필요한 수준의 일반성을 제공하는 역할 만합니다. 그러나 OTOH 는 추가 된 일반성이 유용하고 (추악하고 까다 롭고 혼란스러운) 메커니즘을 숨길 수있는 라이브러리 (la Boost)를 만들 때 전문가에게 매우 유용합니다.
j_random_hacker

3
템플릿 메타 프로그래밍은 적당히, 특히 라이브러리에서 수행하면 세련되게 사용할 수 있습니다. 그러나 너무 자주 나는 사람들이 템플릿 메타 프로그래밍 길을 너무 멀리 내려가는 것을 보았고 그 결과 프로그램이 어려움을 겪습니다. 나는 메타 프로그래밍에 반대하지 않는다. 사실 나는 그것을 강력히 옹호하고있다. 단지 C ++의 기능은 아주 조잡하다.
Anton I. Sipos

2

C ++ 학습을위한 최고의 책. Koenig & Moo의 "Accelerated C ++"는 현대 C ++로 설명하는 내용을 가르치므로 요즘 대부분의 사람들이이를 사용하고 있다고 생각합니다. C ++을 꽤 오랫동안 사용 해 온 사람들에게는 (내 경우에는 80 년대 중반 이후) 현대 C ++은 우리 자신의 배열, 문자열, 해시 테이블 (광고 반복 구역)을 작성하는 지루한 작업을 크게 완화합니다.


1
괴로움을 의미하지는 않지만이 권장 사항에 따라 책을 구입했습니다. 우리는 볼 것이다!
앤드류 위어

2

실제로 C ++ 작업을 살펴 보았고 "현대"라이브러리가 작업 설명에 점점 더 많이 사용되고 있습니다. MFC는 "오래된 스타일"c ++ 라이브러리가 덜 사용됩니다.


1

1990 년대 후반의 언어 표준화는 첫 번째 단계였으며, 컴파일러 제작자들은 "표준"기능 세트에 초점을 맞출 수 있었고, 언어가 표준화 과정을 통해 나타나는 거친 부분을 고칠 수있었습니다.

따라서 특정 컴파일러 구현에서 제공하는 기능이 아니라 언어의 표준 기능을 기반으로 프레임 워크를 개발할 수있었습니다. 부스트 라이브러리는 특히 이와 관련이 있습니다. 또한 이는 새로운 개발이 이전 작업을 기반으로하므로보다 복잡한 문제에 대한 해결책을 제시 할 수있었습니다.

여기서 주목할만한 변화는 이전에 프레임 워크가 기본 클래스와 파생 클래스 (런타임 기능)의 개념에 기반한 방식입니다. 그러나 이제 대부분의 고급 기능은 종종 "재귀"템플릿 (컴파일 타임 기능)을 기반으로합니다.

STL에는 장단점이 있지만 효과가 있고 간단한 것을 원한다면 STL이 시작하는 데 도움이되는 것이 있다면 시간이 지남에 따라 살아 남았습니다. 바퀴를 재발 명할 필요는 없습니다 (교훈적인 이유가 아닌 한).

컴퓨터 하드웨어는 1990 년대부터 크게 도약했으며 메모리와 CPU는 더 이상 컴파일러의 제약이되지 않습니다. 따라서 책의 이론적 최적화 대부분이 가능해졌습니다.

이 언어의 다음 단계는 0x 표준 노력의 일부인 멀티 코어 프로그래밍을 지원하는 것입니다.


1

예, 아니오 확실히 새로운 프로젝트의 경우 점점 인기가 높아지고 있습니다. 그러나 다른 사람들이 언급하지 않은 실질적이지 정치적이지 않은 채택에 대한 장벽이 여전히 존재한다. Modern C ++에서 볼 수있는 기능을 제대로 지원하지 않는 고대 컴파일러의 ABI를 사용하는 많은 상용 C ++ 라이브러리가 있으며 많은 회사가이 라이브러리에 의존합니다. 예를 들어 Solaris의 Sun Studio는 STLport를 사용하지 않고 Boost와 함께 작동 할 수 없지만 사용하려는 타사 상용 라이브러리에는 Sun의 STL 버전이 필요합니다. GCC 2.95 및 Redhat Enterprise Linux와 동일한 이야기.


-3

C ++을보다 안정적으로 만드는 데 거의 노력이 필요하지 않습니다. 경고 시스템은 제자리에 있지만 많이 발전하지는 않습니다. 10 년 전보다 발로 자신을 촬영하는 것이 훨씬 쉽습니다. 이유를 모르지만 C ++은 여전히 ​​내가 가장 좋아하는 언어입니다. :)


C ++ 안정화에 적용되는 "작은 노력"과 "10 년 전보다 훨씬 쉽게 발을 쏠 수있다"고 주장하기 전에이 글에서 몇 권의 책을 읽는 것이 좋습니다.
Patrick Niedzielski

물론 std-library는 메모리 할당 및 문자열 조작에 비해 약간의 안정성을 제공합니다. 불행히도 내부적으로는 이상한 코딩 규칙을 사용하므로 외계인이나 다른 사람이 작성한 것으로 생각합니다. :)
AareP

2
표준 라이브러리는 사양이므로 이상한 내부 코딩 규칙을 사용하는 것은 컴파일러 공급 업체를 비난합니다. 게다가, 이상한 코딩 규칙 = / = 불안정하거나 발로 자신을 쏠 수 있습니다. 이러한 코딩 규칙 (대부분 MSVC 라이브러리 및 아마도 다른 것에 대해서도)은 사용자를 전혀 방해하지 않도록 설계되었으므로 어리석은 일을 할 수 있으며 라이브러리는 신경 쓸 필요가 없습니다. C ++ 사양을 벗어난 코드를 작성하는 경우에는 다릅니다.
Patrick Niedzielski

일반적인 STL 구현이 (가 특정 컴파일러와 함께 제공됩니다 특히) 않습니다 하지 가 그 자체를 구현하는 표준 C ++를 사용합니다. 표준에 의해 보장되는 코드를 코드에 제공하기 위해 자체 구현 구현 지식을 잘 활용할 수 있습니다. 그러나 귀하의 코드는 표준이 보장하는 것에 만 충실해야합니다. 당신은 할 수없는 특정 C ++ 또는 STL 구현을 검사하여 표준 보증을 배운다.
Tanz87

이 답변은 10 년 전에 작성되었습니다. 그 당시 c ++를 보다 안정적 으로 만들기 위해 얼마나 많은 노력을 기울이고 있는지 놀랍습니다 . 이것이 c ++ 0x가 c ++ 11로 출시되기까지 오랜 시간이 걸린 주요 이유 중 하나였습니다.
David Hammen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.