문제

따라서 성능에 대해 이야기 할 때 일반적으로 들리는 의견 중 하나는 작업을 가장 빨리 수행하는 언어로 코드를 작성한다는 것입니다. 특정 영역의 성능이 문제가되는 경우 해당 비트를 C/C ++로 다시 작성하십시오.

그러나 네이티브 C ++ 앱으로 시작한다면 어떨까요? Python, Ruby, C#등과 같은 언어로 쉬운 비트를 쓰거나 오래된 비트를 리팩토링하려면 어떤 옵션이 있습니까? 네이티브와 다른 쪽 사이에 데이터를 전송하는 것은 필수입니다. C ++ 클래스를 데이터로 전달하는 동안 "쉬운"언어로 작성된 기능을 간단히 호출 할 수있는 것은 아름답습니다.

우리는 C# 또는 무언가에서 새 코드를 만들거나 이전 코드를 리팩토링 할 수 있다면 큰 이익을 얻을 수있는 우수한 Win32 앱을 보유하고 있습니다. 그것의 거의 C ++의 복잡성이 필요하지 않으며, 작은 비트를 다루는 것은 프로그래밍 프로세스를 끌어 내고 있습니다.

도움이 되었습니까?

해결책

처럼 아론 피셔 제안, /CLR 옵션을 켜고 C ++ 응용 프로그램을 다시 컴파일 한 다음 .NET 플랫폼을 활용하기 시작하십시오.

C#과 C ++를 이미 알고 있다면 CLI/C ++는 픽업하기가 매우 쉽고 .NET 세계와 기본 C ++ 사이의 브리지를 제공합니다.

현재 C ++ 코드가 /CLR을 켜고 깨끗하게 컴파일 할 수없는 경우, 응용 프로그램을 정적 LIB ( /CLR 활성화없이)로 구축 한 다음 Main ()가 CLI /C ++ 프로젝트에 있도록하는 것이 좋습니다. 레거시 앱 입력 지점을 호출합니다. 이렇게하면 최소한 새로운 기능을 위해 .NET을 활용할 수 있습니다.

.NET CLI/C ++에 "포트"된 "레거시"C/C ++ 앱의 예를 보려면 .NET 포트를 확인하십시오. 지진 2 그리고 지진 3 : 경기장.

다른 팁

글쎄, 그것은 실제로 언어에 달려 있습니다. 예를 들어, 파이썬 인터페이스는 부스트 파이썬으로 가장 쉽게 수행되며 다른 많은 언어는 C 라이브러리를 사용하여 C와 같이 인터페이스하고 콜백을 외부 "C"로 선언해야합니다 (불행한 일이 가능합니다. t 다른 언어로 C ++ 클래스 정의를 사용하십시오).

그러나 나는 또한 C ++가 복잡한 언어로 사용하려는 것을 묻습니다. 그러나 일단 익숙해지면 다른 언어보다 코딩하기가 매우 어렵지 않습니다. 내가 생각할 수있는 유일한 좋은 예외는 한 언어로만 존재하는 강력한 라이브러리를 사용할 계획이고 괜찮은 C ++ 대안이 없다면 (그래픽 라이브러리는 아마도 가장 친숙해야하기 때문에 아마도 가장 좋은 예일 것입니다. 그들과 함께 효과적으로 사용합니다).

C ++ 코드를 다른 언어로 인터페이스하면 해당 언어가 부여한 플랫폼 간 호환성을 잃어 버린다는 점도 지적 할 가치가 있습니다.

C ++와 Python 사이에서 작업하고 싶다면 파이썬 부스트 당신이 찾고있는 것입니다. Cython에 대해 C Python 바인딩을 직접 작성할 수 있지만, 이는 여러 가지 방법으로 코드를 작성하는 방법으로 제한됩니다. 이것은 일부 스 니펫에서 볼 수 있듯이 가장 쉬운 방법입니다. 이 튜토리얼:

Hello World를 수행하는 간단한 기능 :

char const* greet()
{
   return "hello, world";
}

파이썬 코드를 파이썬에 노출시키는 데 필요한 부스트 파이썬 코드 :

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

Python 에서이 코드를 사용하는 방법 :

>>> import hello_ext
>>> print hello.greet()
hello, world

Python은 기본 코드로 컴파일하지 않기 때문에 반대 방향으로가는 것이 약간 더 어렵습니다. Python 통역사를 C ++ 응용 프로그램에 포함시켜야하지만 필요한 작업은 문서화됩니다. 여기. 이것은 Python 통역사를 호출하고 결과를 추출하는 예입니다 (Python 통역사는 C ++에서 사용하기 위해 객체 클래스를 정의합니다).

object result = eval("5 ** 2");
int five_squared = extract<int>(result);

C ++ 프로젝트의 일반 언어 실행 시간 지원을 /CLR로 변경할 수 있습니다. 이 시점부터 C ++ 코드에서 .NET 기능을 바로 사용할 수 있습니다. 여기에는 프로젝트에서 Winforms 생성도 포함됩니다. UI 및 기타 기능을 처리하는 AC# 라이브러리를 추가 할 수도 있습니다.

.NET World에서는 항상 C#/vb.net 어셈블리를위한 COM/ActiveX Interop 레이어를 CRREATING 옵션을 제공합니다.

그런 다음 C ++ 애플리케이션의 일반 COM API를 사용하여 실제로 .NET 어셈블리를 감싸는이 COM 서버의 인스턴스를 만들 수 있습니다.

이것에 대한 좋은 점은 int, bool, string, float 등과 같은 간단한 매개 변수가 귀하와 동등한 것으로 맵핑된다는 것입니다. 그러나 내가 아는 한, 전체 .NET 객체 (생성 된 클래스의 인스턴스)를 쉽게 전달할 수는 없습니다.

또한 COM Interop 통화는 비교적 느리다는 점에주의하십시오. C ++ 코드에서 단단한 루프로 COM 인터 로프 메소드를 계속 호출해서는 안됩니다.

COM/ActiveX는 전통적으로 Windows 레지스트리에 의존했지만 큰 의존성이기 때문에 이상적이지 않습니다. 그러나 사용하는 것도 가능합니다 등록이 없습니다 이 의존성을 피하기 위해 com interop.

이 기사 COM 인터 로프에 .NET 어셈블리를 등록하는 데 필요한 단계를 다룹니다.

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