Gcc로 compile 할 때, wrapping 함수 질문입니다.

astzlra955의 이미지

안녕하세요.

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 되는지 궁금합니다.

kukyakya의 이미지

wrapping 함수라는게 뭘 말씀하시는지 잘 모르겠습니다. 예제 코드를 같이 올려주시는게 어떨까요?

kukyakya의 이미지

최적화 옵션에 따라 다릅니다. inlining을 수행할 경우 AAA가 BBB 함수 내로 inline되어 두 개의 별개의 함수가 구성되는 것이 일반적입니다.

BBB 함수가 AAA를 호출하는 역할만을 수행한다고 해도 BBB 함수가 없어지지는 않습니다.

astzlra955의 이미지

답변 감사합니다.
옵션으로 조절할 수 있군요.

여기에서 추가로, 위의 예제는 1번만 래핑 되었는데,
2번 3번.... 그 이상 저런식의 함수가 구성이 된다면,
그때에도 inline 화 해서 BBB( ) 함수로 들어가는 것인가요?

즉, 함수가 1번만 Call 되는 것인가요?

kukyakya의 이미지

컴파일러가 어떻게 판단하는가에 따라 다릅니다. 컴파일러의 판단에 따라 인라이닝을 수행할 수도/수행하지 않을 수도 있습니다.

함수가 1번만 Call된다는 것을 어떤 의미로 사용하신 건지는 잘 모르겠습니다만, '함수가 수행되는가'의 의미라면 '그렇다'라고 할 수 있겠고, '브랜칭이 1번만 되는가?'의 의미라면 앞서 말씀드린 '컴파일러의 판단에 따라 다르다'라고 할 수 있겠습니다.

메인 함수에서 호출한다면 아예 메인 함수로 인라이닝되어 브랜칭이 전혀 발생하지 않을 수도 있겠죠.

그런데, 인라이닝이 되는가 안되는가가 중요한 작업을 진행중이신건가요? 무조건 인라이닝을 해야한다거나 절대 인라이닝을 하지 말아야 하는 경우 보통은 컴파일러 확장(gcc의 경우 always_inline, noinline) 으로 제공됩니다.

astzlra955의 이미지

제가 다루고 있는 부분이 쓸데 없이 여러번 Call 되는 부분이 많아서요.
시간에 좀 민감한 부분이라 컴파일러가 자동으로 처리를 해주면, 제가 따로 건드릴 필요가 없겠고,
아니라면 좀 수정을 해야하나 고민하고 있어서요.

답변 감사드립니다.
우선 wrapping 함수들을 inline화 해봐야 겠네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.