GCC는 C++ 코드를 컴파일 할 때 inline
키워드로 표시되지 않은 함수를 인라인하도록 선택하여 속도를 최적화하려고 시도합니까?GCC 인라인 C++은 '인라인'키워드없이 작동합니까?
답변
예. 모든 컴파일러는 좋은 생각이라고 생각할 때마다 자유롭게 함수를 인라인 할 수 있습니다. GCC도 그렇게합니다.
-O2 최적화 수준에서 컴파일러가 수행 할 가치가 있다고 생각할 때 (경험적 방법 사용) 및 인라인이 코드 크기를 늘리지 않으면 인라인됩니다. -O3에서는 컴파일러가 코드의 크기를 늘릴 지 여부에 관계없이 컴파일러가 수행 할 가치가 있다고 생각할 때마다 수행됩니다. 또한 모든 최적화 수준 (사용 가능한 최적화)에서는 한 번만 호출되는 정적 함수가 인라인됩니다.
GCC는 '-finline-functions' "인라인으로 선언하지 않더라도 인라인을위한 모든 함수를 고려하십시오."인라인으로 선언 된 함수는 코드 크기를 크게하더라도 인라인으로 간주됩니다. 컴파일러에 대한''inline'의 힌트는 쓸모가 없습니다. 그러나'-O2'를 사용하면'inline' 키워드를 사용하면 코드를 크게 만드는 인라인 함수가 있기 때문에 힌트는 쓸모 없지 않을 것입니다. 그러나 wtih' -O3' 그것은 쓸모 없게 될 것입니다 (저는 힌트를 의미합니다 ...'inline' 키워드는 다른 목적을 가지고 있습니다). –
'-O2'로 인라인되도록 커다란 함수를 만드는 데 문제가 있습니다. -O3으로 인라인 된 모든 함수는 -O2로 인라인됩니다.GCC는''-finline-small-function''에 대해 "함수 호출 코드가 예상보다 작을 때 함수를 호출자와 통합하므로 프로그램의 전체 크기가 작아집니다."라고 말합니다. 그러나 -O2를 사용하여 어셈블리를 보면 명확하게 코드가 커집니다. O3 인라인은 있지만 O2는없는 예제가 있습니까? –
@AnT 컴파일러가 한 번만 호출되는 함수를 인라인하는 것을 방지하는 방법. – bharath
특히 최적화 수준을 높이면 가능합니다.
-fno-inline-functions를 비활성화하려면 컴파일러에 제공 할 수있는 플래그가 있습니다.
사실, -fno-inline-functions는 자동 인라인 및 -fno-inline을 억제합니다 모든 인라이닝을 억제합니다 (출처 : http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html). – KeatsPeeks
좋아요, 귀하의 의견을 바탕으로 업데이트 드리겠습니다. 그 덕분에 – Marcin
'-finline-functions'또는 '-O3'을 사용하면 함수가 인라인됩니다. 또한 '-finline_limit = N'을 사용하여 인라인하는 정도를 조정할 수 있습니다.
그들은 기능이 본질적으로 중복되므로 비용이 많이 들고 속도를 위해 메모리를 희생합니다. –
@ Ape-inago : 연산자 및 접근 자와 같은 작은 공통 함수의 경우 인라인 버전은 함수 호출과 관련하여 레지스터를 저장 및 복원하는 것보다 인라인하는 것이 더 적기 때문에 비용이 적게 듭니다. – Adisak
* 잠재적으로 비싸다 * –
네,하지, 그것은 또한 비 인라인을 생성합니다 있지만 "-O3 이 옵션은 등의 기능 인라인으로이 더 비싼 최적화 켜집니다" 기능 본체가 static
이 아닌 경우 inline
은 다른 번역 단위의 호출에 필요합니다.
inline
함수의 경우 함수가 특정 번역 단위에서 사용되는 경우 함수 본문을 제공하지 않으면 오류이므로 문제가되지 않습니다.
- 1. gcc 인라인 어셈블리의 ljmp 구문
- 2. 컨텍스트 스위칭을위한 gcc 인라인 어셈블리
- 3. GCC 인라인 어셈블리 : 전화 DWORD PTR
- 4. AVR-GCC 인라인 어셈블러로 상대 점프
- 5. GCC 인라인 어셈블리 : 블록 외부의 레이블로 점프
- 6. GCC 인라인 어셈블리 코드에서 % c의 의미는 무엇입니까?
- 7. gcc 컴파일 시도를 방해하는 인라인 어셈블리 오류
- 8. C++ 예외, GCC 및 "인라인 함수"플래그
- 9. gcc - 2 버전, 인라인 함수의 다른 처리
- 10. gcc 옵션 -fstack-check은 정확히 어떻게 작동합니까?
- 11. GCC 인라인 어셈블리 - 호출하기 전에 float를 XMM0으로 이동하십시오.
- 12. GCC asm 인라인 제약 조건, 충돌하는 레지스터 할당
- 13. 인라인 어셈블리 (GCC, IA-32)에서 배정도 숫자로 작업하기
- 14. 인라인 어셈블리 (GCC, IA-32)의 배정 밀도
- 15. gcc 인라인 어셈블리에서 레지스터의 상위 절반을 참조하는 제약 조건은 무엇입니까?
- 16. 첫 번째 어셈블리 프로그램 (GCC 인라인 어셈블리)에서 오류가 발생했습니다.
- 17. GCC 및 GCC 버전
- 18. gcc 4.5를 사용하는 방법?
- 19. Linux의 InterlockedIncrement와 동일/gcc
- 20. 왜 show()는 인라인 CSS를 사용하여 숨겨진 필드에만 작동합니까?
- 21. Django 사용자 권한은 다른 모델의 인라인 테이블 형식이있는 모델에서 작동합니까?
- 22. 인라인 된 함수 찾기
- 23. 컴파일러 인라인 함수의 깊이는 어느 정도입니까?
- 24. GCC를 사용하여 어셈블리 출력으로 인라인 라인을 인라인 할 수 있습니까?
- 25. 인라인 어셈블리 오류
- 26. 은 gcc-4와 호환되는 gcc-3 바이너리입니다.
- 27. 성능 비교 - gcc 및 llvm-gcc
- 28. gcc/최적화 플래그의 지속성 변경 gcc/C
- 29. Xcode를 사용하여 인라인 어셈블리 디버깅
- 30. 인라인 CSS 문제
사양에 따르면, C++의'inline' 키워드는 같은 이름을 가진 컴파일러 최적화와 아무 관련이 없습니다. 키워드는 단순히 링커가 함수의 여러 정의를 볼 것으로 예상한다는 것을 의미합니다. 인라인 * 최적화가 더 쉬워졌습니다. (전체 정의가 여러 번역 단위로 표시 될 수 있기 때문에)하지만 그 정도는 비슷합니다. 컴파일러는'inline'으로 표시되지 않은 함수를 인라인 할 수 있고'inline'으로 표시된 함수는 컴파일러에 의해 반드시 인라인 될 필요는 없습니다. – jalf
클래스 정의 내에 정의 된 메소드 (즉,'{...};)는 기본적으로 키워드없이'inline'입니다. – MSalters