문제

저는 오랫동안 C# 및 .Net 개발자로 일해 왔으며 C++를 배우겠다는 생각을 가지고 놀아 왔습니다.

제가 이것에 대해 생각해 왔던 주된 이유 중 하나는 .Net 프레임워크를 사용하는 앱에 비해 C++가 얼마나 더 빠른지입니다.하지만 Visual Studio에서 C++ 앱을 작성하고/하거나 C++ 애플리케이션에서 .Net 라이브러리를 참조하면 해당 C++가 MSIL(C#과 마찬가지로)로 변환되므로 이점을 잃게 된다고 가정하는 것이 옳습니까? 코딩부터?

그래서 제 질문은 정말 이렇습니다..Net 어셈블리를 참조하는 응용 프로그램의 C++ 구성 요소가 "전통적인" 방식으로 컴파일되거나 MSIL로 컴파일됩니까?

도움이 되었습니까?

해결책

글쎄, 그것은 그것보다 조금 더 복잡합니다.실제로 .NET 지원 C++에는 완전히 다른 두 가지 버전이 있습니다.

이전 버전인 Managed Extensions for C++는 Visual C++ 2002/2003에서 사용할 수 있는 유일한 옵션이었습니다./clr:oldSyntax 옵션 아래의 최신 컴파일러에서 사용할 수 있습니다.표준 C++와 통합하려고 노력하기 때문에 다소 서투릅니다. 따라서 모든 새로운 키워드(그리고 그 키워드가 많이 있음)에는 이중 밑줄 등이 접두사로 붙습니다.이 컴파일러에서 생성된 코드는 IJW가 "그냥 작동합니다"라고 불리는 기본 코드와 MSIL 코드가 혼합된 것입니다.

C++/CLI라는 새로운 언어는 Visual C++ 2005 이상에서 사용할 수 있는 완전히 새로운 언어입니다.가장 중요한 것은 여러 가지 코드 생성 모드를 지원한다는 것입니다./clr 옵션은 다시 기본 코드와 MSIL 코드의 IJW 혼합을 생성합니다./clr:pure는 기본 유형을 해당 .net 구조로 변환할 수 있지만 관리 전용 어셈블리를 생성합니다.따라서 코드는 형식이 안전하지 않을 수 있으며 /unsafe가 있는 C#과 거의 유사한 포인터 연산을 사용할 수 있습니다.그리고 가장 엄격한 옵션은 /clr:safe입니다. 이는 C# 컴파일러와 정확히 동일하게 형식이 안전하고 검증 가능한 MSIL 전용 어셈블리를 생성합니다(즉, /unsafe 없음).

MC++와 C++/CLI의 차이점은 다음을 참조하세요. 위키피디아.

컴파일러 스위치에 대한 설명은 다음을 참조하세요. MSDN.

추신..NET 바이트 코드는 MSIL(Microsoft Intermediate Language) 또는 CIL(Common Intermediate Language)이라고 합니다.MIL은 WPF 및 Vista Desktop Window Manager에서 사용되는 문서화되지 않은 하위 수준 라이브러리인 Media Integration Layer를 나타냅니다.

다른 팁

개념을 별도로 유지하는 것이 좋습니다.

첫째, C++는 언어이므로 어떤 플랫폼을 대상으로 해야 하는지에 대해 아무것도 지정하지 않습니다.원칙적으로 직선 C++ 코드는 네이티브 x86 어셈블러, Java 바이트코드, MSIL 또는 기타 원하는 대로 컴파일될 수 있습니다.나는 Adobe가 최근 Flash 바이트코드를 생성하는 C++ 컴파일러를 만들었다고 생각합니다.

둘째, Microsoft는 전형적인 우유부단함으로 인해 .NET을 대상으로 하는 두 가지 C++ 파생 언어를 만들었습니다.먼저 그들은 "C++용 관리 확장"을 만들었습니다.그런 다음 그들은 그것이 형편없다고 판단하고, 버리고, 그것이 존재하지 않았던 것처럼 가장하려고 했습니다.

이제 .NET 스타일 C++에 대한 최선의 선택은 C++/CLI라고 합니다. C++이 아닙니다.이는 다양한 비표준 방식으로 언어를 확장하고 변경합니다.(그리고 C++ 표준 위원회에서는 혼란을 피하기 위해 이름을 바꾸라고 요청했다고 생각합니다.하지만 그들은 그렇지 않았다)

Visual Studio 2005 이상에서는 C++/CLI를 지원합니다.("프로젝트 추가"에서 Visual C++ -> CLR 아래에 나열됩니다)

하지만 (그렇게 간단하다고 생각하지 않으셨나요?) Microsoft가 다시 한 번 해냈습니다.실제로 C++를 CLI와 통합하려는 합리적으로 잘 설계된 시도인 C++/CLI를 지정한 후 그들은 사실상 이를 사용하는 사람이 없다는 것을 깨달았습니다.C++ 프로그래머라도 일반적으로 .NET에서 작업할 때는 C#을 사용하고 그렇지 않은 경우에는 네이티브 C++를 사용하는 것을 선호하는 것으로 나타났습니다.

그래서 지금 그들은 상호 운용성을 만드는 데 중점을 두고 있습니다. 토종의 C++ 및 .NET은 더 간단하고 강력합니다.그러나 C++/CLI는 사라질 가능성이 없습니다.작동하며 어떤 경우에는 유용합니다.그것은 그들이 원래 바라던 C++ 킬러가 아닙니다.

Visual Studio(이후 영원히)는 .NET에 오염되지 않은 x86 기계어 코드로 컴파일된 네이티브 C++ 애플리케이션도 지원합니다.이는 Visual C++ -> Win32 아래의 "프로젝트 추가" 대화 상자에 나열됩니다.

따라서 C++를 배우고 싶다면 두 가지 선택이 있습니다.예, 기본 기계어 코드 대신 MSIL을 생성하고 실행하려면 .NET이 필요하며 일반적으로 종속성을 사용하려는 경우 귀찮게 할 가치가 없는 MS 전용 언어로 제한하는 C++/CLI를 알아보세요. .NET에서 그래도, C#으로 작성해 보는 것은 어떨까요?

또는 .NET과 완전히 별개이며 .NET 어셈블리를 직접 참조할 수 없는 적절한 C++를 배우십시오.

중요한 점은 서로 다른 언어라는 것입니다.C++/CLI로 컴파일합니다. 즉, 컴파일러에서 .NET 어셈블리를 참조하고 MSIL 코드를 생성할 수 있습니다. 또는 C++로 컴파일합니다. 이 경우 .NET 세계는 존재하지 않습니다.

그리고 마지막으로 주의사항입니다.위의 표현("적절한 C++" 및 ".NET에 오염되지 않음")에도 불구하고 C++는 "더 나은" 것이 아닙니다.많은 경우 속도도 빠르지 않습니다.C++에는 잠재적인 더 빠르지만 프로그래머에 따라 더 많이 달라집니다.

C# 컴파일러는 거의 모든 것을 합리적으로 효율적인 코드로 변환합니다.반면에 C++에는 코드를 작성하는 데 방해가 되는 함정이 가득합니다. 더 느리게 동등한 C#보다.

http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx 그리고 그것이 참조하는 블로그 게시물은 두 언어로 작성된 유사한 코드의 성능에 대해 궁금한 사람이라면 누구나 읽어볼 가치가 있습니다.

C++ 애플리케이션이 지속적으로 더 빨라지는 영역은 단 하나, 바로 시작 시간입니다..NET 애플리케이션은 .NET 프레임워크를 로드하고 MSIL 코드를 JIT해야 할 수 있습니다. 여기서 기본 애플리케이션은...그냥 시작합니다.

그러나 그 외에는 C++가 더 빠를 것이라고 가정하는 것은 아마도 실수일 것입니다.그것 ~할 수 있다 왜냐하면 그것은 당신에게 좀 더 많은 통제력을 제공하기 때문입니다.그러나 일반적으로 이는 컴파일러가 코드에서 발생하는 비효율성을 방지할 수 있는 능력이 적다는 것을 의미합니다.

이것 관리되는 C++와 관리되지 않는 C++에 대한 꽤 좋은(만약 날짜가 있는 경우) 토론입니다.

간단히 말해 C++는 관리형(MIL로 컴파일) 또는 비관리형(네이티브 코드로 컴파일)이 될 수 있습니다.

C++를 배우고 싶어하는 이유가 무엇이든, 더 많은 언어를 아는 것은 항상 좋은 일입니다. 왜냐하면 C++를 배우는 것은 그 자체로 귀중한 교훈이기 때문에 마음을 넓힐 수 있기 때문입니다.

C++를 사용하면 .NET 애플리케이션 C++/CLI 또는 네이티브로 실행할 수 있습니다.Visual Studio의 컴파일러 스위치일 뿐이지만 둘 사이에는 구문 차이가 많이 있습니다.개인적으로 두 가지 맛을 모두 배우는 것이 유용하다고 생각합니다.

프로젝트에서 무엇을 선택할지는 요구 사항에 따라 다릅니다.프로그램이 C#으로 작성된 모듈과 같은 다른 관리되는 모듈과 상호 작용해야 하는 경우 관리 코드와 비관리 코드 간의 오버헤드 전환을 피하기 위해 C++/CLI를 사용하는 것이 좋습니다.

C++ 구성 요소는 .Net 어셈블리를 쉽게 참조할 수 없습니다(COM을 사용해야 함).Managed C++는 CIL로 컴파일되며 C#과 동일한 성능 프로필을 갖습니다.

C++는 대부분의 코드에 대해 동일한 수준의 최적화에 대해 약 10% 더 빠르지만 C#은 작성 및 디버그에 절반의 시간이 걸리므로 동일한 시간 동안 최적화를 적용하면 C#이 더 빨라질 것이라고 주장합니다.

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