2009-03-17 5 views

답변

5

명백한. 그렇게하는지의 여부는 함수가 실제로 인라인 될 수 있는지 여부에 따라 달라집니다 (예 : 재귀 함수가 될 수 없음).

편집 : 그냥 명확히하기 - 질문자이 무시되고, 이전 파라에서 표준에서 그가 인용 것과 : 구현이 에서이 인라인 대체를 수행 에 필요하지 않습니다

전화 거점

+0

부적절한 소멸자 호출을 제외하면 꼬리 재귀 함수는 인라인 정의를 확장하더라도 루프에 "인라인 될"수 있습니다.:) –

+0

답변 해 주셔서 감사합니다. 그러나 내 질문에 대한 대답이 없습니다. –

+0

질문을 명확하게하십시오. –

8

"인라인"의 의미를 오해하고있는 것처럼 보입니다. 함수가 자동으로 인라인된다는 의미는 아닙니다. 7.1.2-2에 따라 인라인 대체가 선호된다.

따라서 컴파일러가 자유롭게 결정할 수 있기 때문에 코드에서 인라인으로 레이블링되었는지 여부를 알 수 없습니다. 그것은 단지 컴파일러 힌트 일뿐입니다.

+0

나는이 표준을 따르는 모든 컴파일러가 EMPTY 함수를 인라인 할 것이라고 믿는다. 루프에서이 빈 함수가 수백만 번 호출된다고 가정 해 봅시다. 효율성이 1000000 * call_time/0 * inlined_nothing이기 때문에 컴파일러가 인라인해야한다고 생각합니다. –

+0

당신이 좋아하는 것을 믿을 수 있습니다. 사실이 아닙니다. –

+1

실제 인라이닝은 구현의 품질 문제입니다. 컴파일러는 완벽하게 인라인하거나 자유롭게 사용할 수 있습니다. 당신이 그것을 좋아하지 않는다면, 옵션이 일을 바꾸는 지, 아니면 다른 컴파일러를 얻는 지보십시오. –

0

컴파일러는 일반적으로 함수 호출 수, 함수의 의사 명령어 수 및 다른 것들을 기반으로 인라인을 기반으로합니다. 어떤 일을하는 지에 대한 아이디어는 GCC documentation on optimization options을보십시오. 기본적으로 inline 키워드는 컴파일러가 인라인 될 확률을 높이는 힌트 일뿐입니다. 인라인 결정은 일반적으로 복잡합니다.

4

테스트에 결함이있는 것 같습니다. 컴파일러에서 인라인 지정자를 무시하는지 여부는 이러한 파일 하나만으로 테스트 할 수 없습니다.

인라인 함수 정의가 포함 된 머리글을 포함시켜 여러 개의 구현 파일에 포함시킨 다음 함께 링크해야합니다. 해당 함수의 여러 정의 된 인스턴스에 대한 링커 오류가 발생하면 컴파일러 은 가장 중요한 속성과 관련된 인라인 지정자를 무시하고입니다. 동일한 주소 및 해당 주소를 계속 유지하면서 전체 프로그램에서 여러 번 정의하도록 허용합니다. 지역 정적 변수.

컴파일러가 실제로 컴파일러에 대한 힌트이고 인라인 지정자의 다른 많은 중요한 결과 중 일부만있는 컴파일러가 함수 호출을 인라인하는지 여부는 테스트에서 확인합니다. 컴파일러가 함수에 대한 호출을 인라인하지 않으면 잘 수행됩니다. 표준에서는이 문제에 대해 아무 것도하지 않아도됩니다.

2

은 매우 유사한 질문에 대한 내 대답을 참조하십시오 When is "inline" ineffective? (in C)

요약 : 인라인 만 여러 정의를 허용하는 데 필요합니다. 변경을 호출하는 함수는 전적으로 선택 사항입니다.

+1

다른 대답은 C++에 관한 것인데 C++에서는 다릅니다. 인라인 함수를 사용하는 경우 함수의 "정확히 하나의 외부 정의"가 필요하지 않습니다. 인라인 함수 자체는 C++의 정의입니다. C에서는 그렇지 않지만, 단지 "인라인 정의"일뿐입니다. –

+0

알아요.하지만 실제로 C++ 관련 용어를 다시 읽었습니다.이 질문에 대한 실질적인 차이는 거의 없습니다. 인라인이 실제로 무엇을 의미하는지 이해하지 못하는 것이 전부입니다. – Richard

관련 문제