Gcc로 compile 할 때, wrapping 함수 질문입니다.
글쓴이: astzlra955 / 작성시간: 수, 2014/06/18 - 1:56오후
안녕하세요.
Gcc로 Linux를 compile 할 때, wrapping 함수를 어떻게 처리하는지 궁금합니다.
랩핑 함수를 그대로 컴파일 해서, 함수를 계속 Call 해서 들어가도록 컴파일되는지,
코드 최적화를 위해서 wrapping 함수로 쌓인 함수를 바로 Call 하는지 알고싶습니다.
제가 사용하는 Gcc버전은 4.4.5 입니다.
예를 들어,
int AAA(int a, int b) {
return a+b;
}
위와 같은 함수가 있다면,
int BBB(int b, int a) {
return AAA(a, b);
}
위와 같은 BBB( ) 함수가 래핑 함수고,
이 BBB( )를 main( )함수 등에서 Call 해서 쓰는 것이지요 AAA( ) 함수를 Call 하기 위해...
위와 같은 함수일 경우, 결국 BBB( ) 함수는 딱히 하는 일이 없고, AAA( ) 함수로 연결해 주는 역할 밖에 안합니다.
따라서 compile 할 때 BBB( ) 함수로 이동해서 다시 AAA( ) 함수로 이동하도록 compile를 하는지, 아니면 main( ) 함수 등에서 곧바로 AAA( )함수를 Call 하도록 compile 되는지 궁금합니다.
Forums:
wrapping 함수라는게 뭘 말씀하시는지 잘
wrapping 함수라는게 뭘 말씀하시는지 잘 모르겠습니다. 예제 코드를 같이 올려주시는게 어떨까요?
최적화 옵션에 따라 다릅니다. inlining을
최적화 옵션에 따라 다릅니다. inlining을 수행할 경우 AAA가 BBB 함수 내로 inline되어 두 개의 별개의 함수가 구성되는 것이 일반적입니다.
BBB 함수가 AAA를 호출하는 역할만을 수행한다고 해도 BBB 함수가 없어지지는 않습니다.
답변 감사드립니다.
답변 감사합니다.
옵션으로 조절할 수 있군요.
여기에서 추가로, 위의 예제는 1번만 래핑 되었는데,
2번 3번.... 그 이상 저런식의 함수가 구성이 된다면,
그때에도 inline 화 해서 BBB( ) 함수로 들어가는 것인가요?
즉, 함수가 1번만 Call 되는 것인가요?
컴파일러가 어떻게 판단하는가에 따라 다릅니다.
컴파일러가 어떻게 판단하는가에 따라 다릅니다. 컴파일러의 판단에 따라 인라이닝을 수행할 수도/수행하지 않을 수도 있습니다.
함수가 1번만 Call된다는 것을 어떤 의미로 사용하신 건지는 잘 모르겠습니다만, '함수가 수행되는가'의 의미라면 '그렇다'라고 할 수 있겠고, '브랜칭이 1번만 되는가?'의 의미라면 앞서 말씀드린 '컴파일러의 판단에 따라 다르다'라고 할 수 있겠습니다.
메인 함수에서 호출한다면 아예 메인 함수로 인라이닝되어 브랜칭이 전혀 발생하지 않을 수도 있겠죠.
그런데, 인라이닝이 되는가 안되는가가 중요한 작업을 진행중이신건가요? 무조건 인라이닝을 해야한다거나 절대 인라이닝을 하지 말아야 하는 경우 보통은 컴파일러 확장(gcc의 경우 always_inline, noinline) 으로 제공됩니다.
감사합니다.
제가 다루고 있는 부분이 쓸데 없이 여러번 Call 되는 부분이 많아서요.
시간에 좀 민감한 부분이라 컴파일러가 자동으로 처리를 해주면, 제가 따로 건드릴 필요가 없겠고,
아니라면 좀 수정을 해야하나 고민하고 있어서요.
답변 감사드립니다.
우선 wrapping 함수들을 inline화 해봐야 겠네요.
댓글 달기