2013-02-28 1 views
2

마침내 매우 내 그래프 검색 자의 기본 버전이 CLI를 통해 작동하지만 모든 코드를 리팩토링해야하는 위치에 있습니다. Mac에서이 프로그래밍을하고 있기 때문에 GUI 용으로 Cocoa를 사용하고 C++ 기능을 workhorses로 사용하려고합니다. 이것은 결국 임시 수정이 될 것이고 결국에는 리눅스 박스/클러스터에서 모든 코드를 실행할 수 있기를 원합니다. Here 구현에 대한 내 마지막 질문이며, 내 자신의 그래프 함수를 롤링 (지금 당장),이 작업을 향상시키지 않았다.Objective-C와 부스트/C++의 혼합

그래서 내 생각은 다음과 같습니다. 그래프 자체에 대한 C++ 클래스를 빌드하고 계산할 수량에 대한 함수 나 메소드를 분리하십시오. This은 Objective-C와 C++을 함께 사용하는 것과 관련하여 찾을 수있는 최신 설명입니다. 하지만 궁금 해서요 :

Xcode에서 내 C++ 코드를 컴파일하는 것이 최적화되어 있습니까? 요점은 C++ 코드가 빠른 메모리 액세스, 다중 스레드를 위해 완벽하게 최적화되고 boost 라이브러리에 액세스 할 수 있기를 바랍니다. 그런 다음 래핑 ObjectiveC 클래스에 C++ 클래스를 캡슐화 할 수 있습니다. 이렇게하려면 2 개의 클래스가 있어야합니다. .h 및 .cpp 파일 및 포함 된 부스트 라이브러리가있는 C++ 클래스, .h 및 .mm 파일이있는 ObjC 클래스 래퍼 (여기서 .h는 C++ 클래스에 대한 참조를 포함하지 않음) .mm 파일. 그렇다면 Objective C에 대해 일반적인 MVC 디자인과 GUI 구현을 사용할 수 있습니다. dealloc 명령에 C++ 클래스의 핵 능력을 부여하면 메모리 관리에 대해 걱정할 필요가 없습니다. ARC는 C++에서도 잘 작동하며 OSX에 메모리를 관리하고 C++ 코드를 정리할 수있는 기능을 제공합니까?

내가 스레딩을 원한다면 GCD 코딩이 특정 플랫폼이 될 것이므로 스레딩을 향상시킬 것이라고 생각합니다 (현재로서는 이것이 모두 실행됩니다). 지금 당장은 텍스트 파일을 구문 분석하여 그래프를 작성하기 때문에 코어 데이터에서 벗어날 것입니다.

답변

5

Xcode에서 내 C++ 코드를 컴파일하는 것이 최적화되어 있습니까?

컴파일러 (GCC 또는 clang)가 코드를 컴파일하는 Xcode가 아니며 적절한 컴파일러 플래그를 사용하여 코드를 컴파일하도록 요청하면 코드를 최적화합니다. C++과 Objective-C가 어떻게 컴파일러를 최적화하지 못하게하는지 알지 못합니다 ...

dealloc 명령에 C++ 클래스의 핵 능력을 부여하는 한, 걱정할 필요가 없습니다. 메모리 관리에 대해?

구체적으로? 여전히 일 경우은 C++ 및 Objective-C 오브젝트 모두에 대해 정상적으로 메모리를 관리해야합니다.

ARC는 C++에서도 잘 작동합니까?

아니요, Objective-C 기능입니다. C++에는 참조 카운팅조차 없다 (필자는 ...).

+2

부스트 및 C++ 11에서 공유 포인터는 실제로 참조 카운팅을 사용합니다. . . 하지만 Objective-C와는 전혀 호환되지 않습니다. –

+0

ARC는 여전히 C++ (ObjC 객체에만 사용)에서 작동하며 __unsafe_unretained를 사용하지 않고도 구조체에 ObjC obj를 포함 할 수 있습니다. C++의 메모리 관리는 다른 이야기입니다. share_ptr은 참조 카운팅을 활성화하는 데 사용될 수 있습니다 (그러나 성능이 좋지 않을 수 있습니다). –

+0

@JasperBlues 머리를 주셔서 감사합니다. 그러나 그것은 상관이 없습니다. –

1

H2CO3이 말한 모든 것에 동의합니다 (참고 카운팅에 대해서는 nit-pick 제외).

또한, 그래, -dealloc는 C++ 개체를 삭제할 수있는 좋은 장소입니다 :

또한 OSX 및 iOS 용 다니엘 세프 턴 created a nice article on how to compile Boost가 있습니다 싶었어요.

스레딩 :

  • 만 OSX 및 iOS를 타겟팅 할 경우, C++ (11)이 아직 안드로이드에서 지원하지 않는 원시 스레드 지원을하고있다. 스레딩

다른 옵션은 다음과 같습니다 (pthreads의 일명)

  • POSIX 스레드
  • 부스트 스레드
  • 마시고 스레드

개인적 포코를 사용합니다.

+0

좋아요, 그건 꽤 도움이됩니다. C++ 클래스를 작성한 다음 랩핑 할 수 있습니다. 한 가지 다른 질문은 C++ 객체에서 I/O 및 멀티 스레딩을 수행하는 방법입니다. GDC를 사용하는 대신 boost :: thread 라이브러리를 사용해야한다고 가정합니다. 모든 점을 메모리에 맞출 수 없기 때문에 어느 시점에서의 I/O가 더 높아져야 할 것입니다.하지만 나중에 문제가됩니다. – NuclearAlchemist

+0

일부 스레딩 세부 정보로 업데이트되었습니다. –

1

Xcode에서 내 C++ 코드를 컴파일하는 것이 최적화되어 있습니까?

예.

이렇게하려면 필자는 본질적으로 2 개의 클래스를 갖습니다. 맞습니까? .h 및 .cpp 파일 및 포함 된 부스트 라이브러리가있는 C++ 클래스, .h 및 .mm 파일이있는 ObjC 클래스 래퍼 (여기서 .h는 C++ 클래스에 대한 참조를 포함하지 않음) .mm 파일.

수정.

dealloc 명령에 C++ 클래스의 핵 능력을 부여하는 한 메모리 관리에 대해 걱정할 필요가 없습니까?

예, C++ ivar을 선언 할 때 ObjC 개체 수명의 적절한 지점에서 C++ 개체의 기본 생성자 및 소멸자가 호출됩니다.

일반 C++과 마찬가지로 C++ ivars에 원시 포인터 대신 값 또는 스마트 포인터를 사용하고 개체의 수명을 조금이라도 추가 할 수 있습니다. 컴파일러는 ARC가 처리되면 C++ 유형에 ObjC 참조 카운팅을 적용하지 않습니다 (결국 C++ 객체는 정확히 참조 카운트되지 않습니다).

ARC는 C++에서도 잘 작동하며 OSX에 메모리 관리 기능과 C++ 코드 정리 기능을 제공합니까?

ARC는 ObjC 유형에만 적용됩니다. C++ 또는 C 유형/할당에 대해서는 아무것도 수행하지 않습니다. C++ 및 C 할당/유형에 스마트 포인터 또는 적절한 C++ 대체품 (즉, std::vector) 만 사용하면됩니다. delete, delete[] 또는 free을 C++로 작성해야하는 경우 스마트 포인터를 올바르게 사용하지 않습니다. ARC와 거의 비슷하며 유연성이 뛰어납니다.

CLANG_WARN_OBJCPP_ARC_ABI을 살펴볼 수도 있습니다.

ARC는 프로그램이 ObjC++로 컴파일 될 때 ObjC + ARC로 컴파일 될 때가 아니라 던진 예외에서 풀어 낼 때 -release d가 될 것입니다.