2014-11-24 3 views
7

나는 C++ 11의 꽉 루프에서 인라인 할 필요가있는 함수를 가지고있다.GCC, Clang 및 인텔 컴파일러에서 하나의 매크로로 인라인을 실행 하시겠습니까?

이 함수를 헤더와 별도의 파일에 구현하고 그것이 사용되는 모든 곳에서 인라인되도록해야한다. 또한 clang, GCC 및 인텔 컴파일러 모두를 사용하여 컴파일하려고합니다.

요구 사항을 자세히 설명합니다.

#define force_inline <something here> 
헤더에서

:

force_inline void foo(); 

내가 구현 파일에서이 작업을 수행 할 수 있어야한다 :

void foo() {... Code.. } 
나는 내가 뭔가를 할 수 있도록 해주는 매크로를 찾고 있어요

그냥 분명히하기 위해 헤더에 코드를 넣고 싶지는 않습니다. 나는 그들이 그 기능의 선언만을 포함하기를 바란다.

모든 컴파일러에서 작동하는 매크로로 인라이닝 할 수있는 방법이 있습니까?

내가 지금까지 가지고있는 가장 좋은 방법은이 매크로입니다 :

#define forceinline inline __attribute__((always-inline)) 

ICC가 필요한 것으로 보인다 인라인을 보장하고 헤더의 완전한 이행 (코드를 인라인 함께 할 수 없다) 모두 inline 함수의.

추신 : 예, 성능을 측정했는데 실제로 기능을 인라인하는 것이 더 빠르다는 사실을 알고 있습니다. 그리고 아니오, 컴파일러는 나를 위해 그것을하지 않습니다.

+1

컴파일과 링크를 위해'gcc -flto -O2'를 사용하십시오. 또는 단순히 헤더 파일에'static inline' 함수를 정의하면됩니다. –

+1

답변이 너무 많습니까? 나는 세 컴파일러 모두에서 동시에 작동하는 매크로를 찾고있다. –

+0

매크로는 인라인에 유용하지 않습니다. –

답변

1

정의에 따르면 인라인 함수는 컴파일러가 호출하는 각 위치에 코드가 포함되어 있습니다.

이것은 컴파일러가 호출자 컴파일 유닛을 빌드 할 때 함수의 코드에 액세스 할 수 있어야한다는 것을 의미합니다. 이것은 기술적으로 가능하지만 쉽고 거의 확장 할 수 없습니다. 헤더와 라이브러리 만 배포하면 구성 요소를 사용하는 컴파일러가 라이브러리에서 코드를 검색해야합니다.

컴파일러로 구현하면 일반 함수만큼 코드가 부족할 수 있다는 이점이 없습니다. CPP 파일을 변경하면 헤더에 따라 모든 파일을 다시 컴파일해야합니다. 변화 없음). 유일한 이점은 코드를 포함하지 않는 헤더를 갖는 것입니다 (여전히 좋은 점입니다).

제가 알고있는 유일한 해결책은 GCC의 링크 시간 최적화입니다. 그러므로 clang 및 icc와의 작업 요구 사항을 충족시키지 못합니다 : https://gcc.gnu.org/wiki/LinkTimeOptimization 특정 옵션을 사용하는 컴파일러에 대해 비슷한 점이있을 수 있습니다. 컴파일러 종속 코드를 지원해야합니다.

해결 방법 1 : 당신은 헤더의 모든 구현하지 않고 "깨끗한 클래스"를 유지하고 (하지만 여전히 헤더 내부) 클래스의 외부 인라인 함수를 넣을 수 있습니다. 헤더에는 정의가 있지만 선언문과 명확하게 구분되므로 가독성이 떨어집니다. 당신이 정말로 헤더만을 선언을 원하는 경우, 대신 2의 3 개 파일에 코드를 분리하는 것입니다, 당신의 문제를 완화하는 또 다른 방법 :

해결 방법 2 (이것은 나의 선호하는 솔루션은 개인적입니다) - 인터페이스 만 를 포함하는 .H 파일 - .H 파일 에 의해 인라인 함수를 포함하고 포함 .I 파일 - 코드

의 나머지 부분을 포함하는 .CPP/.CC 파일은 분명히 이것은으로도 단점이 당신의 코드가 두 개의 다른 파일로 분리되었습니다 ...

제가 놓친 문제점을 보았을 때 그리고이 명제에서 볼 수있는 점이 있다면 알려주십시오.