2009-10-26 8 views
25

GCC는 C++ 코드를 컴파일 할 때 inline 키워드로 표시되지 않은 함수를 인라인하도록 선택하여 속도를 최적화하려고 시도합니까?GCC 인라인 C++은 '인라인'키워드없이 작동합니까?

+10

사양에 따르면, C++의'inline' 키워드는 같은 이름을 가진 컴파일러 최적화와 아무 관련이 없습니다. 키워드는 단순히 링커가 함수의 여러 정의를 볼 것으로 예상한다는 것을 의미합니다. 인라인 * 최적화가 더 쉬워졌습니다. (전체 정의가 여러 번역 단위로 표시 될 수 있기 때문에)하지만 그 정도는 비슷합니다. 컴파일러는'inline'으로 표시되지 않은 함수를 인라인 할 수 있고'inline'으로 표시된 함수는 컴파일러에 의해 반드시 인라인 될 필요는 없습니다. – jalf

+2

클래스 정의 내에 정의 된 메소드 (즉,'{...};)는 기본적으로 키워드없이'inline'입니다. – MSalters

답변

31

예. 모든 컴파일러는 좋은 생각이라고 생각할 때마다 자유롭게 함수를 인라인 할 수 있습니다. GCC도 그렇게합니다.

-O2 최적화 수준에서 컴파일러가 수행 할 가치가 있다고 생각할 때 (경험적 방법 사용) 인라인이 코드 크기를 늘리지 않으면 인라인됩니다. -O3에서는 컴파일러가 코드의 크기를 늘릴 지 여부에 관계없이 컴파일러가 수행 할 가치가 있다고 생각할 때마다 수행됩니다. 또한 모든 최적화 수준 (사용 가능한 최적화)에서는 한 번만 호출되는 정적 함수가 인라인됩니다.

+0

GCC는 '-finline-functions' "인라인으로 선언하지 않더라도 인라인을위한 모든 함수를 고려하십시오."인라인으로 선언 된 함수는 코드 크기를 크게하더라도 인라인으로 간주됩니다. 컴파일러에 대한''inline'의 힌트는 쓸모가 없습니다. 그러나'-O2'를 사용하면'inline' 키워드를 사용하면 코드를 크게 만드는 인라인 함수가 있기 때문에 힌트는 쓸모 없지 않을 것입니다. 그러나 wtih' -O3' 그것은 쓸모 없게 될 것입니다 (저는 힌트를 의미합니다 ...'inline' 키워드는 다른 목적을 가지고 있습니다). –

+1

'-O2'로 인라인되도록 커다란 함수를 만드는 데 문제가 있습니다. -O3으로 인라인 된 모든 함수는 -O2로 인라인됩니다.GCC는''-finline-small-function''에 대해 "함수 호출 코드가 예상보다 작을 때 함수를 호출자와 통합하므로 프로그램의 전체 크기가 작아집니다."라고 말합니다. 그러나 -O2를 사용하여 어셈블리를 보면 명확하게 코드가 커집니다. O3 인라인은 있지만 O2는없는 예제가 있습니까? –

+0

@AnT 컴파일러가 한 번만 호출되는 함수를 인라인하는 것을 방지하는 방법. – bharath

7

특히 최적화 수준을 높이면 가능합니다.

-fno-inline-functions를 비활성화하려면 컴파일러에 제공 할 수있는 플래그가 있습니다.

+2

사실, -fno-inline-functions는 자동 인라인 및 -fno-inline을 억제합니다 모든 인라이닝을 억제합니다 (출처 : http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html). – KeatsPeeks

+0

좋아요, 귀하의 의견을 바탕으로 업데이트 드리겠습니다. 그 덕분에 – Marcin

3

'-finline-functions'또는 '-O3'을 사용하면 함수가 인라인됩니다. 또한 '-finline_limit = N'을 사용하여 인라인하는 정도를 조정할 수 있습니다.

1
+0

그들은 기능이 본질적으로 중복되므로 비용이 많이 들고 속도를 위해 메모리를 희생합니다. –

+1

@ Ape-inago : 연산자 및 접근 자와 같은 작은 공통 함수의 경우 인라인 버전은 함수 호출과 관련하여 레지스터를 저장 및 복원하는 것보다 인라인하는 것이 더 적기 때문에 비용이 적게 듭니다. – Adisak

+0

* 잠재적으로 비싸다 * –

1

네,하지, 그것은 또한 비 인라인을 생성합니다 있지만 "-O3 이 옵션은 등의 기능 인라인으로이 더 비싼 최적화 켜집니다" 기능 본체가 static이 아닌 경우 inline은 다른 번역 단위의 호출에 필요합니다.

inline 함수의 경우 함수가 특정 번역 단위에서 사용되는 경우 함수 본문을 제공하지 않으면 오류이므로 문제가되지 않습니다.

관련 문제