GCC 4.4 또는 MSVC를 사용하여 C++를 컴파일 할 때 함수가 인라인 될 때 컴파일러에서 메시지를 내보낼 수 있습니까? g의 ++와인라인 된 함수 찾기
답변
, 나는 당신이 g ++ 보고서가 할 수 있다고 생각하지 않습니다,하지만 당신은 문자, 예를 들어 nm
보여줍니다 어떤 도구를 사용하여 결과 이진 검사 할 수 있습니다 :
#include <iostream>
struct T {
void print() const;
};
void T::print() const { std::cout << " test\n" ; }
int main()
{
T t;
t.print();
}
~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc
~ $ nm test | grep print
0000000000400800 t _GLOBAL__I__ZNK1T5printEv
0000000000400830 T _ZNK1T5printEv
#include <iostream>
struct T {
void print() const { std::cout << " test\n" ; }
};
int main()
{
T t;
t.print();
}
~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc
~ $ nm test | grep print
대를
(두 번째 경우의 nm 출력 없음)
EDIT : 또한 프로파일 러가 사용될 수 있습니다. gprof의 쇼,이 두 가지 예에서 :
0.00 0.00 0.00 1 0.00 0.00 global constructors keyed to _ZNK1T5printEv
0.00 0.00 0.00 1 0.00 0.00 T::print() const
대 단지
0.00 0.00 0.00 1 0.00 0.00 global constructors keyed to main
FWIW와 거의 같은 성능을 보였다. 컴파일러는 일부 인스턴스를 인라인 할 수있다. 다른 사람들은 아닙니다. 프로그램이 충분히 크다면, 좀 더 복잡한 것이 필요하다. – Cogwheel
사실. 나는 어떤 프로파일 러 (gprof가 나타나지 않는 것)와 같은 것을보고하는지 궁금하다. 쓸만한 작은 도구 일 수 있습니다. – Cubbi
감사합니다. 컴파일 된 바이너리의 차이점을 볼 수 있습니다. 헤더 전용 버전은 더 많은 기능을 인라인 한 것으로 보입니다. 이전에 gprof를 실행했고 (-pg로 컴파일 된)이 둘 사이에는 큰 차이가 없었습니다. 난 그냥 callgrind 및 헤더 전용 버전에서 프로그램을 실행 그들은 callgrinds 출력에 표시되지 않는 많은 기능에 인라인 것으로 나타납니다. –
좋은 질문하지만 난 당신의 동기에 대한 궁금 해요. – Daniel
헤더에서 cpp 파일로 많은 코드를 이동시키는 구조화 된 코드가 다시 느리게 실행됩니다. 함수 인라이닝의 수에 차이가 있는지보고 싶습니다. –
어떻게 지을까요? 출시 또는 디버그? Visual Studio에서/OPT를 지정하고 있습니까? –