컴파일러가 생성 한 함수를 찾는 방법은 무엇입니까?


11

컴파일러 생성 함수, 3의 규칙 및 5의 규칙에 대해 알고 있습니다. 실제 시나리오에서는 컴파일러가 실제로 생성 한 컴파일러 생성 함수 (생성자, 할당 연산자, 소멸자)를 정확히 파악하는 것이 쉽지 않을 수 있습니다.

특정 클래스에 대해 컴파일러 생성 함수를 나열하는 방법이 있습니까?

나는 주로 Visual Studio 2019 및 Xcode에 관심이 있지만 일반적인 솔루션은 훨씬 더 환영받을 것입니다.

답변:


11

규칙은 복잡합니다. Howard Hinnant의 프레젠테이션 에서 인용 한 다른 답변에서 훔칠 것 입니다.

여기에 이미지 설명을 입력하십시오

여기서의 교훈은 좋은 관행은 컴파일러 암시 적 선언에 의존하지 않고 모든 특수 멤버를 명시 적으로 선언하는 것입니다 (필요에 따라 기본값 또는 삭제됨)


모든 특수 멤버를 명시 적으로 선언하면 이동 생성자 및 대입 연산자에 대해 "선언되지 않은"특수 멤버 상태가 손실됩니다.
Maxim Egorushkin

@MaximEgorushkin 내 요점은 필요할 때 기본값을 선언하는 것입니다 (기본값은 여전히 ​​선언되지 않았을 수도 있음). 원하지 않는 경우 삭제됩니다.
bolov

2
@ bolov 차트는 유용하지만 내 질문에 대답하지 않습니다. 컴파일러가 실제로 생성 한 함수를 찾고 싶습니다. 다시 말해서, 나는 이론적으로 어떤 일이 일어나야하는지에 대해 묻지 않고 실제로 어떤 일이 일어나고 있는지에 대해 묻고있다.
Helge Klein

1
@ tjwrona1992 :이 주장에 따르면 컴파일러가 의도 한 것과 다른 것을 수행하면 버그가 있어야한다는 것을 알기 때문에 코드를 테스트 할 필요가 없습니다.
ruakh

1
@ tjwrona1992 : 그렇습니다. 마찬가지로, 컴파일러가 생성 한 내용을 보는 요점은 컴파일러가 올바른지 확인하는 것이 아니라 컴파일러에 올바른 입력을 제공했는지 확인하는 것입니다.
ruakh

7

"특정 클래스에 대한 컴파일러 생성 함수를 나열 할 수있는 방법이 있습니까?"

물론 있습니다. 에 리눅스 (와 다른 유닉스 시스템)를 사용할 수 있습니다 nm, readelf그리고 objdump에 생성 된 오브젝트 파일 / 라이브러리 / 모든 수출 문자 (등을)을 분해하고 검사 실행.

Windows 에는 비슷한 도구가 있지만, 내가 사용하는 플랫폼이 아니기 때문에 불행히도 정확한 도구 이름을 지정할 수는 없습니다.


1
비록이 도구들이 어떤 함수 생성되었는지 보여주지 못할 수도 있지만 (예를 들어, 컴파일러가 함수를 생성하도록 허용되었지만, 그 함수를 사용하지 않았기 때문에 귀찮게하지 않기로 결정했거나 링크 타임 코드 제거 기능이 제거되었습니다)
JMAA

@JMAA 대부분의 경우 표준 용어로 "생성 할 수는 있지만 사용되지 않음"은 함수가 "암시 적으로 선언되었지만" "암시 적으로 정의되지 않음"을 의미합니다. 예, 이것은 여전히 ​​인라인이 비활성화되어 있어도 기호가 표시되지 않음을 의미합니다.
aschepler

1
엄밀히 말하면,이 답변은 "컴파일러가 생성 한 메소드는 무엇입니까?"라는 질문에보다 정확하게 응답합니다. "어떤 방법이 다른 컨텍스트에서 컴파일러에 의해 생성되었을 수 있습니까?"라는 훨씬 덜 정확한 질문과는 다릅니다.
rici

@rici True. 그러나 더 정확한 질문은 쉽게 대답 할 수 없으므로 대답 할 수있는 내용으로갔습니다. 내 대답이 가치가 없다고 생각되면 자유롭게 투표하십시오.
Jesper Juhl

1
@ jesper : 아니, 난 이미 upvoted. 나는 당신이 대답 한 질문이 더 정확하다고 생각합니다. 의도적 인 것일 수도있는 다른 질문은 그에 반하는 것이기 때문에 약간의 손을 내 밀어야합니다. 그러나 이것은 의도적으로 또는 말 그대로 문자 그대로 묻는 질문이므로 대답하십시오.
rici

1

이것은 현재 부분적인 답변 일뿐입니다.

Visual Studio 2019

생성자

클래스 객체를 정의 할 때 Visual Studio의 IntelliSense 함수는 컴파일러에서 생성 한 것과 직접 생성 한 사용 가능한 생성자를 보여줍니다.

여기에 이미지 설명을 입력하십시오

불행히도이 정보가 항상 나오지는 않습니다. 위의 스크린 샷에서 작동하게하려면 괄호 안에 무언가를 입력해야하므로 쉼표로 입력하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.