2009-12-14 2 views

답변

1

"MAP"파일을 생성하십시오. 이렇게하면 인라인되지 않은 모든 함수의 주소가 제공됩니다. 함수가이 목록에 표시되면 인라인되지 않습니다. 그렇지 않으면 인라인되거나 완전히 최적화됩니다 (예 : 전혀 호출되지 않은 경우).

5

각 통화 사이트는 잠재적으로 다를 수 있습니다.

컴파일러는 인라인 할 가치가있는 특정 부모 메서드와 인라인 할 가치가없는 다른 부모 메서드를 결정할 수 있습니다. 따라서 각 호출 사이트에서 assembley를 검사하지 않고 실제로 실제 대답을 결정할 수는 없습니다.

결과적으로 사용하는 모든 도구가 사용자에게 오해의 소지가있는 대답을 줄 가능성이 있습니다. 기호의 존재 여부를 확인하는 도구를 사용하는 경우 (일부 호출 사이트에서 필요하기 때문에 나타날 수 있지만 잠재적으로 다른 호출 사이트에서는 인라인 될 수 있음). 반대로 기호가 없다는 것은 메서드/함수가 인라인되지 않음을 의미하지는 않습니다 (정적 인 파일처럼) 정적이어서 컴파일러는 심볼을 유지할 필요가 없습니다 (그러나 인라인되지 않았습니다).

2

/FAs 컴파일러 옵션을 사용하여 소스 코드로 asm을 덤프하는 것이 내가 알고있는 유일한 방법입니다.

참고 : 함수를 인라인으로 만들려면 __forceinline을 사용하십시오.

+0

__forceinline은 모든 경우에 인라이닝을 강제하지 않습니다. http://msdn.microsoft.com/ko-kr/library/z8y1yy88.aspx –

0

어셈블리로 건너 뛰고 싶지 않으면 함수를 __forceinline으로 선언하고 실행 파일이 커지면 인라인되지 않았 음을 알 수 있습니다.

+1

필수 사항은 아닙니다. 예를 들어 일반적인 멤버 get 함수는 인라인 될 때 ​​실제로 코드가 작아 질 수 있습니다. 이 포인터를 통해 멤버 액세스가 이루어지기보다는 함수를 호출하고이를 통해 멤버에 액세스하고 함수에서 반환합니다. –

+0

사실, 이미 깔려 있다면, __forceinline은 어떤 것도 변경해서는 안되기 때문에 실행 파일의 크기가 변경되면 __forceinline에서 변경해야합니다. 좋은 캐치. – Overflowed

+0

-1, 문제는 리차드가 제공 한 이유 때문에 반대가 아니라는 것입니다. 실행 파일이 크기를 변경하지 않으면 어떻게 결론을 내릴 수 있습니까? – MSalters

6

경고 C4714, C4710 및 C4711을 활성화하면 어떤 기능이 있고 인라인되지 않은 지에 대한 자세한 정보를 얻을 수 있습니다.

관련 문제