다른 언어에서는 너무 어렵거나 지저분한데 C++가 할 수 있는 일은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/423335

  •  05-07-2019
  •  | 
  •  

문제

나는 아직도 C++이 이길 수 없는 몇 가지 기능을 제공한다고 생각합니다.여기서 불꽃 전쟁을 시작하려는 의도는 없습니다. C++를 좋아하지 않는다는 강한 의견이 있다면 여기서 발산하지 마십시오.나는 C++ 전문가들이 왜 이를 고수하는지 듣고 싶습니다.

나는 특히 잘 알려지지 않았거나 충분히 활용되지 않는 C++ 측면에 관심이 있습니다.

편집하다: 여러분, 이미 말한 내용과 중복되지 않도록 다른 답변을 대략적으로 읽어보시기 바랍니다. 다른 사람이 말한 내용에 동의한다면 찬성 투표하세요!

도움이 되었습니까?

해결책

효율성을 결합 해야하는 응용 분야에서 여전히 최고 성능의 범용 언어이므로 C ++에 머물 렀습니다. 그리고 복잡성. 예를 들어, 나는 측량 산업을위한 핸드 헬드 장치 용 실시간 표면 모델링 소프트웨어를 작성합니다. 제한된 리소스, Java, C#등을 감안할 때 필요한 성능 특성을 제공하지는 않지만 C와 같은 하위 레벨 언어는 약한 추상화 특성이 주어지면 개발하기가 훨씬 느립니다. C ++ 개발자가 이용할 수있는 추상화 수준의 범위는 거대합니다. 하나의 극단에서는 과도하게 말할 수 있도록 산술 연산자를 과부하 할 수 있습니다. MaterialVolume = DesignSurface -GroundSurface 동시에 특정 장치에서 내 앱의 메모리를 가장 효율적으로 관리하기 위해 여러 가지 다른 힙을 실행하는 동안. 이것을 거의 모든 일반적인 문제를 해결하기 위해 자유롭게 이용할 수있는 풍부한 소스와 결합하면 강력한 개발 언어가 하나 있습니다.

C ++는 여전히 대부분의 도메인에서 대부분의 문제에 대한 최적의 개발 솔루션입니까? 아마도, 핀치에서는 여전히 대부분의 사람들에게 사용할 수 있습니다. 고성능 응용 프로그램의 효율적인 개발을위한 최상의 솔루션입니까? 의심의 여지없이 IMHO.

다른 팁

RAII / 결정 론적 최종화. 아니요, 쓰레기 수집은 아닙니다 마찬가지로 좋아요 부족하고 공유 된 자원을 다룰 때.

OS API에 대한 액세스 권한이 없습니다.

발에 자신을 쏘았습니다.

다른 언어는 그러한 창의적인 도구를 제공하지 않습니다. 포인터, 다중 상속, 템플릿, 연산자 과부하 및 전처리 기.

발 사격을위한 풍부한 기회를 제공하는 놀랍도록 강력한 언어.

편집 : 유머에 대한 나의 절름발이 시도가 일부를 화나게했다면 사과드립니다. 나는 C ++가 내가 원했던 어셈블리 언어 수준에서 코딩 할 능력과 원하는 경우 높은 수준의 추상화로 내가 사용한 가장 강력한 언어라고 생각합니다. C ++는 90 년대 초부터 저의 기본 언어였습니다.

내 대답은 발에서 자신을 쏘는 수년간의 경험에 근거한 것이 었습니다. 적어도 C ++는 우아하게 그렇게 할 수 있습니다.

결정 론적 물체 파괴는 몇 가지 웅장한 디자인 패턴으로 이어집니다. 예를 들어, RAII는 쓰레기 수집만큼 일반적인 기술은 아니지만 GC로 얻을 수없는 인상적인 기능으로 이어집니다.

C ++는 또한 튜링-완성 전 처리기가 있다는 점에서 독특합니다. 이를 통해 실행 시간 대신 시간을 컴파일하기 위해 많은 코드 작업을 선호 할 수 있습니다. 예를 들어, 실제 코드에는 assert () 명령문이있을 수 있습니다. 현실은 조만간 일어날 것이며 휴가 중일 때 오전 3시에 일어날 것입니다. C ++ Preprocessor는 컴파일 시간에 동일한 테스트를 수행합니다. 컴파일 타임 어제는 오전 8시에서 오후 5시 사이에 실패하여 컴퓨터 앞에 앉아 코드 빌드를 보는 동안; 하와이에서 잠들 때 오전 3시에 런타임 어설 션이 실패합니다. 거기에서 승리를보기가 매우 쉽습니다.

대부분의 언어에서 전략 패턴은 런타임에 이루어지고 유형 불일치시 예외를 제외합니다. C ++에서 전략은 전처리 시설을 통해 컴파일 타임에서 수행 할 수 있으며 TypeSafe를 보장 할 수 있습니다.

인라인 어셈블리(MMX, SSE 등)를 작성합니다.

결정적 객체 파괴.즉.진짜 파괴자.부족한 자원을 더 쉽게 관리할 수 있습니다.RAII를 허용합니다.

구조화된 바이너리 데이터에 더 쉽게 액세스할 수 있습니다.메모리 영역을 구문 분석하고 각 값을 구조체에 복사하는 것보다 메모리 영역을 구조체로 캐스팅하는 것이 더 쉽습니다.

다중 상속.인터페이스로 모든 것을 할 수 있는 것은 아닙니다.때로는 실제 기능도 상속하고 싶을 때가 있습니다.

나는 템플릿을 사용하여 표현을 잡고 필요할 때 게으르게 실행할 수있는 능력에 대해 C ++를 칭찬 할 것이라고 생각합니다. 이것이 무엇인지 모르는 사람들을 위해 여기 예입니다.

템플릿 Mixins는 내가 다른 곳에서 보지 못한 재사용을 제공합니다. 그들과 함께 당신은 손으로 모든 것을 쓴 것처럼 많은 행동을 가진 큰 물체를 만들 수 있습니다. 그러나이 기능의 이러한 작은 측면은 재사용 될 수 있으며, 여러 인터페이스를 구현하는 인터페이스 (또는 모든 것)의 일부를 구현하는 데 특히 좋습니다. 결과적인 물체는 모두 상환되기 때문에 번개가 빠릅니다.

많은 경우 속도는 중요하지 않을 수 있지만 구성 요소 소프트웨어를 작성할 때 사용자는 구성 요소를 복잡한 작업을 수행하는 방법으로 구성 요소를 결합 할 수 있으며, 인라인 및 C ++의 속도는 훨씬 더 복잡한 구조를 만들 수있는 것으로 보입니다.

메모리 레이아웃, 정렬 및 필요할 때 액세스에 대한 절대 제어. 충분히 조심하면 매우 캐시 친화적 인 프로그램을 작성할 수 있습니다. 다중 프로세서 프로그램의 경우 캐시 일관성 메커니즘에서 많은 느린 다운을 제거 할 수도 있습니다.

(좋아요, C, 어셈블리 및 아마도 Fortran 에서도이 작업을 수행 할 수 있습니다. 그러나 C ++는 나머지 프로그램을 더 높은 수준으로 쓸 수 있습니다.)

이것은 아마도 인기있는 대답이 아닐지 모르지만 C ++를 차별화하는 것은 컴파일 타임 기능 (예 : 템플릿 및 #Define)이라고 생각합니다. 이러한 기능을 사용하여 프로그램에서 모든 종류의 텍스트 조작을 수행 할 수 있으며, 그 중 상당수는 단순성이라는 이름으로 이후 언어로 버려졌습니다. 나에게 그것은 C ++에서 더 쉽거나 빠른 저수준 비트 피들링보다 더 중요합니다.

예를 들어 C#에는 실제 매크로 시설이 없습니다. 다른 파일을 소스에 직접 #ininclude 또는 #define을 사용하여 프로그램을 텍스트로 조작 할 수 없습니다. 반복적 인 코드를 기계적으로 입력해야 할 때마다 더 나은 방법이 있다는 것을 생각해보십시오. 당신은 당신을 위해 코드를 생성하기위한 프로그램을 작성했을 수도 있습니다. 글쎄, C ++ 사전 처리기는 이러한 모든 것들을 자동화합니다.

C#의 "제네릭"시설은 C ++ 템플릿에 비해 유사하게 제한됩니다. C ++를 사용하면 도트 연산자를 템플릿 타입 T에 맹목적으로 적용 할 수 있으며, 예를 들어 존재하지 않는 메소드를 호출하고 템플릿이 실제로 특정 클래스에 적용되면 적용됩니다. 이런 일이 발생하면 T에 대한 모든 가정이 실제로 유지되면 코드가 컴파일됩니다. C#은 이것을 허용하지 않습니다 ... 유형 "t"는 기본적으로 객체로 처리해야합니다. 즉, 모든 것 (할당, gethashcode (), equals ())에서 사용할 수있는 가장 낮은 공통 분모 만 사용합니다.

C#은 단순성의 이름으로 전처리 기와 실제 제네릭을 제거했습니다. 불행히도, C#을 사용할 때, 나는 C ++ 접근법보다 필연적으로 더 부풀어 오르고 계층화 된 이러한 C ++ 구조물의 대체물에 도달하는 것을 발견했습니다. 예를 들어, 프로그래머는 외부 어셈블리에 동적으로 연결, 여러 위치에서 상수를 다시 정의하거나 데이터베이스에서 상수를 선택하는 등 여러 번의 부풀어 오른 방식으로 #include가없는 상태에서 작동하는 것을 보았습니다.

Simpson의 Crabapple이 한 번 말했듯이, 이것은 "Pretty Lame, Milhouse"입니다.

컴퓨터 과학 측면에서 C ++의 이러한 컴파일 타임 기능을 사용하면 Call-by-Name 매개 변수 전달과 같은 것들을 가능하게합니다.

다시 말하지만, 이것은 아마도 인기있는 대답이 아닙니다. 예를 들어 모든 입문 C ++ 텍스트는 #Define에서 경고합니다. 그러나 수년에 걸쳐 다양한 언어와 함께 일하고이 모든 이론을 고려한 후 많은 사람들이 나쁜 조언을하고 있다고 생각합니다. 이것은 특히 "그것"으로 알려진 희석 된 서브 필드에서 발생하는 것 같습니다.

기술적으로, 나는 아무것도 없다고 생각합니다!

솔직히 C ++가 할 수있는 일이 있다고 생각하지 않습니다. D 언어 캔트. C ++가 어떤 능력을 가지고 있는지에 관계없이 D 또는 다른 언어보다 항상 더 어렵고 지저분합니다. 클래스 선언과 같은 단순한 것조차도 C ++에서 다른 언어보다 훨씬 어렵고 지저분합니다.

C ++가 할 수있는 유일한 일은 C ++로 이미 작성된 수백만 줄의 코드와 호환되는 것입니다.
이것은 C ++ 이외의 언어가 할 수없는 유일한 일입니다. :)

최소한의 오버헤드로 프로세스 전반에 걸쳐 POD 구조를 전달합니다.즉, 이진 데이터 덩어리를 쉽게 처리할 수 있습니다.

C# 및 Java는 'main ()'함수를 클래스에 넣도록 강요합니다. 나는 그것이 수업의 의미를 희석하기 때문에 이상하다고 생각합니다.

나에게 클래스는 문제 영역의 객체 범주입니다. 프로그램은입니다 ~ 아니다 그런 대상. 따라서 프로그램에 '프로그램'이라는 클래스가 없어야합니다. 이것은 상징을 사용하여 수학적 객체를 나타내는 기호와 함께 증거를 표시하는 기호를 사용하여 수학적 증거와 동일합니다. 이상하고 일관성이 없을 것입니다.

다행스럽게도 C# 및 Java와 달리 C ++는 글로벌 기능을 허용합니다. 이를 통해 Main () 기능이 외부에 존재할 수 있습니다. 따라서 C ++는 객체 지향 관용구의보다 단순하고 일관되며 아마도 더 진실한 구현을 제공합니다. 따라서 이것은 C ++가 할 수있는 한 가지이지만 C#과 Java는 할 수 없습니다.

나는 연산자 오버로딩이 꽤 좋은 기능이라고 생각합니다.물론 이는 매우 많이 남용될 수 있습니다(Boost 람다처럼).

선택적으로 강력한 추상화 메커니즘을 제공하는 동안 시스템 리소스 (Esp. Memory)에 대한 엄격한 제어. 내가 아는 유일한 언어는 이와 관련하여 C ++에 가까워 질 수있는 언어는 Ada입니다.

C ++는 메모리에 대한 완전한 제어를 제공하므로 결과적으로 A는 프로그램 실행의 흐름을 훨씬 더 예측 가능합니다. 기억의 할당과 거래가 몇시에 정확하게 말할 수있을뿐만 아니라, 자신의 힙을 정의하고, 다른 목적을 위해 여러 개의 힙을 가지고 있으며, 메모리 데이터가 할당되는 위치를 정확하게 말할 수 있습니다. 이것은 게임 콘솔, 휴대 전화, MP3 플레이어 등과 같은 임베디드/실시간 시스템에서 프로그래밍 할 때 종종 유용합니다.

  1. 도달하기 쉬운 메모리에 엄격한 상한을 가지고 있습니다 (물리적 메모리가 부족할 때 속도가 느려지는 PC를 사용한 구조).
  2. 종종 균질하지 않은 메모리 레이아웃이 있습니다. 한 가지 유형의 물리적 메모리로 한 유형의 객체를 할당하고 다른 유형의 다른 유형의 객체를 다른 조각으로 할당 할 수 있습니다.
  3. 실시간 프로그래밍 제약 조건이 있습니다. 잘못된 시간에 쓰레기 수집가를 예기치 않게 전화하는 것은 비참 할 수 있습니다.

Afaik, C 및 C ++는 이런 종류의 일을하는 유일한 현명한 옵션입니다.

솔직히 말하면, 충분한 코드를 기꺼이 작성하려는 경우 무엇이든 할 수 있습니다.

따라서 귀하의 질문에 답하기 위해 C ++가 할 수없는 다른 언어로 할 수없는 일은 없습니다. 그것은 단지 당신이 얼마나 많은 인내심을 가지고 있으며, 당신은 그것을 일하기 위해 긴 잠들지 않는 밤을 기꺼이 바치고 있습니까?

사무실 개발과 같이 C ++ 래퍼가 헤더 파일을 읽을 수 있기 때문에 쉽게 할 수있는 것들이 있습니다 (헤더 파일을 읽을 수 있기 때문에). 그러나 다시, 누군가가 RCW 또는 "런타임 호출 가능한 래퍼"에서 당신을 위해 그것을 "랩"하기 위해 많은 코드를 작성했기 때문입니다.

편집 : 또한 이것이로드 된 질문이라는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top