2011-03-31 2 views
0

을 확장 할 보장이 기능을 내가 헤더 파일은 프로그램에 포함 된이 선언이내가 직장에서 일부 코드를 통해가는 인라인

inline 
    FLAGS get_flags(void) { 
    FLAGS res; 
    memset(&res, 0, sizeof(res)); 
    return res 
} 

을 발견했다. 이 스택에 할당 된대로 인라인되지 않은 경우 그것은 매우 나쁜 것임을 알고 있습니다. 우리는 문제의 코드에 결코 문제가 없었지만, 나는 그저 궁금했다.

+2

이 함수가 인라인되는지 여부는 함수의 안전성과 관련이 없습니다. 값으로 res를 반환합니다. – Jon

+0

중요합니까? memset()에 대한 호출은 확실히 인라인되지 않으므로 함수를 인라인하면 많은 비용을 절약 할 수 없습니다. – Clifford

+0

@Clifford : 사실, gcc가 -O3 및 MSVC로 인라인합니다. – GManNickG

답변

6

아니요, 인라인으로 확장되지 않을 수 있습니다. inline은 컴파일러에 대한 힌트 일뿐입니다.

즉, res이 실제로 스택에 있지만, 사본은입니다. 인라인 확장이 발생하지 않으면 "매우 나쁜 일"이되지 않습니다.

+0

사본에 대한 좋은 지적 ... 내가 왜 그걸 보지 못했는지 모르겠다. :) 감사합니다. – DavidMFrey

2

아니요, 컴파일러에서 인라인 할 수 있다고 보장 할 수 없습니다. this answer을 참조하십시오. Strousoup으로

는 인라인 지정이 코드 [...] 인라인을 생성하려고 시도하기보다는 한 번 기능에 대한 코드를 내려 놓고해야 컴파일러에 대한 힌트 인 C++ 프로그래밍 언어

말한다 그런 다음 일반적인 함수 호출 메커니즘을 통해 호출합니다.

키워드 힌트에 유의하십시오.

0

컴파일러는 inline 키워드를 무시할 수 있습니다. 그렇지 inline이에 아주 나쁜 일이 있다면, 당신은 #define 매크로를 사용한다, 또는 (당신이 C++로이 태그를 추가 한 이후) 적절한 생성자 클래스를 만드는 등

1

inline는 두 가지 목적을 가지고 있지만, 더 이상 문제가되지 않습니다.

다른 사람들이 말했듯이 컴파일러가 함수를 인라인해야 함을 암시하는 목적은 모두 쓸모가 없습니다. 컴파일러는 프로그래머보다 인라인되어야하는 것을 결정할 때 훨씬 낫다.

중요한 두 번째 사용 (은 귀하의 경우을 적용 함)은 하나의 정의 규칙 (ODR)을 위반한다는 것입니다. 즉, 정상적인 상황에서 링커는 두 번 이상 정의 된 기호를 보는 것을 허용해서는 안됩니다. 그러나 해당 심볼이 inline으로 선언 된 경우 각 심볼의 정의가 동일하고 나머지는 무시한다고 가정 할 수 있습니다.

함수가 헤더 파일에 있기 때문에 둘 이상의 변환 단위에서 정의 될 수 있으므로 코드를 오류없이 컴파일 할 수 있도록 ODR을 해제해야합니다.

+0

[경비원 포함] (http://en.wikipedia.org/wiki/Include_guard)은 어떤 경우에도 * 번역 단위 *에서 다중 정의를 방지하고, 사용되는 경우'inline'은이 문맥에서'정적'과 같은 효과를냅니다. – Clifford

+0

@Clifford : 부분적으로 정확합니다. 경비원을 포함시키는 것은 당신이하는 말을하지만, 여러 번역 단위로 당신을 보호하지는 못합니다. 그러나'inline'은 링커가 정의를 병합 할 수 있으므로'inline'은'static' int hat과 같지 않습니다.'static'은 링커에 의해 병합됩니다. – GManNickG

+0

@GMan : 요점은 원래 여러 번역 단위가 아니라 "번역 단위"라고 말한 것이 었습니다. 정적과 인라인의 차이점은 - 공정한 점이지만 링커가 최적화를 수행하는지 여부는 다시 보증하지 않습니다. 링커는 컴파일러에서 생성 된 코드가 동일하다는 것을 알아야합니다. 둘 이상의 인라인이 동일한 이름이 정의되거나 각 객체 모듈이 다른 옵션으로 컴파일되었습니다. – Clifford

0

"스택에 할당 된"변수에 대한 함수의 동작은 인라인되는지 여부에 관계없이 변경되지 않습니다. 따라서 스택 관련 문제가 무엇이든 관계없이 두 경우 모두 똑같이 유효하거나 무효합니다.

0

대부분의 컴파일러는 최적화가 켜져있을 때만 진정한 인라인입니다. 일반적으로 소스 수준 디버거를 사용하여 디버깅을위한 최적화를 해제하고 종종 이러한 디버거가 인라인 된 코드에서 제대로 작동하지 않게하여 디버깅을 더 어렵게 만듭니다. 함수가 정상적으로 구현되면 디버거는 인라인을 고려할 필요가 없습니다.

관련 문제