2017-09-24 1 views
0

다음 코드에 대해 x86-64asm generated by GCC 7.1을 보면 의 생성자는 코드를 생성하고 b에는 생성자의 레이블이 없음을 발견했습니다.기본 및 빈 생성자가 C++에서 다른 컴퓨터 코드를 생성하는 이유는 무엇입니까?

class a { 
public: 
    int aint; 

    a() { } 
}; 

class b { 
public: 
    int bint; 

    b() = default; 
}; 

int main() { 
    a ac; 
    //   lea  rax, [rbp-4] 
    //   mov  rdi, rax 
    //   call a::a() 
    ac.aint = 2; 
    //   mov  DWORD PTR [rbp-4], 2 


    b bc;    // no instructions for this statement 
    bc.bint = 5; 
    //   mov  DWORD PTR [rbp-8], 5 

    return 0; 
} 

여기 생성자에 대해 생성 된 코드가 다른 이유는 무엇입니까? a() { }b() = default과 같은 코드를 생성하지 않는 이유는 무엇입니까?

+0

다른 코드? – EJP

+0

@ EJP, 그는 링크에 godbolt의 코드를 보여주었습니다. – prl

+2

최적화 여부에 상관없이 컴파일 중이십니까? without (예 :'-O0')이 그 이유 일 것입니다. – Peter

답변

5

최적화 (-O0)가 없으면 gcc는 쉽게 디버깅 할 수있는 코드를 생성하므로 모든 명령문과 함수 호출이 소스에 포함됩니다. :: a에 중단 점을 설정할 수 있습니다. 더 높은 최적화 수준에서는 생성자 호출을 볼 수 없습니다.

관련 문제