C ++가 D보다 더 잘하는 것의 대부분은 메타적인 것입니다. C ++에는 더 나은 컴파일러, 더 나은 도구, 더 성숙한 라이브러리, 더 많은 바인딩, 더 많은 전문가, 더 많은 자습서 등이 있습니다. 보다 성숙한 언어에서 기대합니다. 이것은 논쟁의 여지가 없다.
언어 자체에 관해서는 C ++이 D보다 더 나은 점이 몇 가지 있습니다. 아마도 더 있을지 모르지만 여기에 내 머리 꼭대기를 나열 할 수있는 몇 가지가 있습니다.
C ++은 유형 시스템을 더 잘 이해하고
있습니다. 현재 D의 유형 시스템에는 몇 가지 문제점이 있는데, 이는 설계에 대한 감독으로 보입니다. 예를 들어, 구조체에 const의 전이성 및 postblit 생성자가 값 유형에서 작동하는 방식으로 인해 클래스 객체 참조 또는 포인터가 포함되어 있으면 const 구조체를 비 const 구조체에 복사하는 것은 현재 불가능합니다. Andrei는이 문제를 해결하는 방법을 알고 있지만 자세한 내용은 밝히지 않았습니다. 문제는 확실히 고칠 수 있지만 (C ++ 스타일의 복사 생성자를 소개하는 것이 하나의 해결책 일 것입니다), 현재 언어의 주요 문제입니다.
나를 괴롭힌 또 다른 문제는 논리적 const가 없다는 mutable
것입니다 (예 : C ++에서는 그렇지 않습니다 ). 이것은 스레드 안전 코드를 작성하는 데는 좋지만 const 객체 내에서 게으른 초기화를 수행하는 것을 어렵게 만듭니다 (불가능합니까?) (첫 번째 호출에서 반환 된 값을 구성하고 캐시하는 const 'get'함수를 생각하십시오).
마지막으로, 이러한 기존의 문제를 주어, 나는 타입 시스템 (나머지 방법에 대한 걱정 pure
, shared
그들이 사용에 투입되면, 등) 언어의 다른 모든 것들과 상호 작용합니다. 표준 라이브러리 (Phobos)는 현재 D의 고급 유형 시스템을 거의 사용하지 않으므로 스트레스를받을 지에 대한 질문은 합리적이라고 생각합니다. 나는 회의적이지만 낙관적입니다.
C ++에는 유형 시스템 사마귀 (예 : 비 전이 성, 불필요 iterator
한 구성 요소가 있음 const_iterator
)가있어 아주 추악하지만 C ++의 유형 시스템이 부분적으로 약간 잘못되었지만 D와 같은 작업을 수행하는 것을 막지는 않습니다. 때때로 그렇습니다.
편집 : 분명히하기 위해, C ++에는 더 나은 시스템이 아니라고 생각하는 유형 시스템이 있다고 생각합니다 . 기본적으로 DI에서는 C ++에없는 유형 시스템의 모든 측면을 사용하는 데 위험이 있다고 생각합니다.
D는 때때로 너무 편리합니다.
C ++에 대해 자주 듣는 비판은 저수준 문제를 숨기고 있다는 것입니다. 예를 들어 a = b;
변환 연산자 호출, 과부하 할당 연산자 호출 등과 같은 많은 작업을 수행하는 것과 같은 간단한 할당은 다음과 같습니다 . 코드에서보기가 어렵습니다. 어떤 사람들은 이것을 좋아하지만 어떤 사람들은 그렇지 않습니다. 어느 쪽이든, D에는 더 (더 좋은?)으로 인해 같은 것들로 opDispatch
, @property
, opApply
, lazy
당신이 기대하지 않는 것들로 무고한 찾고 코드를 변경할 수있는 잠재력을 가지고있다.
나는 이것이 개인적으로 큰 문제라고 생각하지 않지만, 일부는 이것을 벗어난 것으로 생각할 수 있습니다.
D 가비지 수집
이 필요합니다 . GC없이 D를 실행할 수 있기 때문에 논란의 여지가 있습니다. 그러나 그것이 가능하다고해서 그것이 실용적이라는 것을 의미하지는 않습니다. GC가 없으면 D의 많은 기능을 잃어 버리고 표준 라이브러리를 사용하는 것은 광산에서 걷는 것과 같습니다 (누가 메모리를 할당하는지 알고 있습니까?). 개인적으로, 나는 GC없이 D를 사용하는 것이 완전히 비현실적이라고 생각합니다. 만약 당신이 GC를 좋아하지 않는다면 (이것처럼) 이것은 상당히 과장 될 수 있습니다.
D 메모리의 순진한 배열 정의 메모리 할당
이것은 내 애완 동물입니다.
int[3] a = [1, 2, 3]; // in D, this allocates then copies
int a[3] = {1, 2, 3}; // in C++, this doesn't allocate
분명히 D에서 할당을 피하려면 다음을 수행해야합니다.
static const int[3] staticA = [1, 2, 3]; // in data segment
int[3] a = staticA; // non-allocating copy
이 작은 '뒤에'할당은 이전 두 가지 요점의 좋은 예입니다.
편집 : 이것은 현재 알려진 문제입니다.
편집 : 이제 수정되었습니다. 할당이 발생하지 않습니다.
결론
나는 D vs C ++의 부정적인 점에 중점을 두었습니다. 왜냐하면 그것이 질문 한 것이기 때문에이 게시물을 C ++가 D보다 낫다는 진술로 보지 마십시오 .D가 더 나은 곳을 쉽게 만들 수 있습니다. C ++보다. 어느 것을 사용할지 결정하는 것은 당신에게 달려 있습니다.