2010-03-16 1 views
6

릴리스 빌드에 대해 -finline-functions 최적화와 함께 gcc를 사용하고 있습니다. 임베디드 시스템에서 작업하기 때문에 코드가 부 풀리는 것을 방지하려면 특정 기능을 인라인하지 말고 싶습니다. 이를 수행하는 확실한 방법은 함수 속성 즉 속성 (noinline)을 사용하는 것입니다. 문제는 -O3 스위치의 일부인 global -finline-function 최적화를 켜면 작동하지 않는 것입니다.gcc -finline-functions behavior?

또한 템플릿과 동일한 기능을 가진 템플릿이없는 버전이 예상대로 인라인되지 않습니다.

이 글로벌 스위치가 켜져있을 때 인라이닝을 제어하는 ​​방법에 대한 아이디어가 있습니까?

#include <cstdlib> 
#include <iostream> 

using namespace std; 

class Base 
{ 
public: 

    template<typename _Type_> 
    static _Type_ fooT(_Type_ x, _Type_ y) __attribute__ ((noinline)); 
}; 

template<typename _Type_> 
_Type_ Base::fooT(_Type_ x, _Type_ y) 
{ 
    asm(""); 
    return x + y; 
} 


int main(int argc, char *argv[]) 
{ 
    int test = Base::fooT(1, 2); 
    printf("test = %d\n", test); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+1

관련이 없지만 대문자가 뒤에 오는 밑줄로 시작하는 식별자는 컴파일러 용으로 예약되어 있습니다. – GManNickG

+0

__attribute __ ((noinline))을 정의에 첨부하면 안됩니까? – jpalecek

+0

@jpalecek : No는 컴파일 오류입니다 – user176168

답변

4

docs for GCC's noinline 말 :

이 함수 속성은 인라인 고려되는 기능을 방지

여기에 코드입니다. 함수에 부작용이 없으면 함수 호출이 라이브 임에도 불구하고 함수 호출이 최적화되도록하는 인라인 이외의 최적화가 있습니다. 멀리 최적화되는 등의 통화를 유지하기 위해,

내가 무엇을 당신에게 일이 될 수 있다고 생각 특별한 부작용 역할을, 호출 된 함수에

 asm (""); 

를 (볼은 ASM 확장) 넣어 Base::fooT<> 함수에는 부작용이 없기 때문에 GCC는 위에서 언급 한 다른 지정되지 않은 최적화를 호출합니다.

+0

답장 시간이 오래 걸려 죄송합니다. 아니 슬프게도 gcc 여전히 그것을 인라인, 나는 전에 이것을 시도했다. 4.1.1을 사용하고 있는데, 누구도이 버그와 관련한 버그를 알고 있습니까? 답장을 보내 주셔서 감사합니다.이 주제에 대한 많은 지식이 있습니다. – user176168

1

static 후과 같이 정의하기 전에 noinline 속성을 넣어보십시오 :

template<typename _Type_> 
    static __attribute__ ((noinline)) _Type_ fooT(_Type_ x, _Type_ y); 

이 나를 위해 일을 너무 다른 사람을 위해 작동하는 것 같다, 참조 : How can I tell gcc not to inline a function?

을가 아무튼 어떤 이유로 함수 뒤에 noinline 속성을 넣거나 gcc 설명서에 나온 내용에도 불구하고 asm("")을 함수 본문에 넣으면됩니다.

1

답변이 가치가없는 오래된 낡은 실. 위의 방법이 효과가 없다면 항상 간단한 해결 방법이 있습니다. 다른 cpp 파일에 삽입하여 이러한 메소드를 사용하려는 번역 단위에서 구현을 숨겨야합니다. GCC> = 4.5

EDIT

함수 전문의 방법을 대체 noinline 속성 noclone있다.