표준에 따르면 extern 인라인 함수는 모든 번역 단위에서 동일한 주소 여야합니다.Extern 인라인 함수는 모든 변환 단위에서 동일한 주소를 가져야합니다. 도대체 어떻게 된거 야?
어떻게 컴파일러에서이 작업을 수행 할 수 있습니까? 나는 번역 단위를 컴파일 할 때 다른 TU가 어떤 것인지 알지 못합니다. 어떻게하면 같은 주소를 사방에 배치 할 수 있습니까?
표준에 따르면 extern 인라인 함수는 모든 번역 단위에서 동일한 주소 여야합니다.Extern 인라인 함수는 모든 변환 단위에서 동일한 주소를 가져야합니다. 도대체 어떻게 된거 야?
어떻게 컴파일러에서이 작업을 수행 할 수 있습니까? 나는 번역 단위를 컴파일 할 때 다른 TU가 어떤 것인지 알지 못합니다. 어떻게하면 같은 주소를 사방에 배치 할 수 있습니까?
구현에 달려 있지만 일반적으로 링커가 해결합니다. 컴파일 된 각 변환 단위는 링커가 중복을 예상하고 받아 들여야한다는 것을 알 수 있도록 어떤 식 으로든 플래그가 지정된 함수의 복사본을 포함하는 객체 파일을 생성합니다. 링커는 그 중 하나를 포함하고 나머지는 버리고 함수에 대한 참조를 해결합니다.
간단한 전략 : 이러한 inline
함수가 정의 될 때마다 정상적인 함수 인 것처럼 시간을 객체화하도록 컴파일하십시오. 그런 다음 링크시에 중복 기능을 감지하고 제거하여 각 사본을 하나씩 남겨 둡니다. 이것은 C++ 컴파일러가 10 년 전 (템플릿의면에서도) 작업했던 방식입니다. 요즘 어떻게하는지 모르겠습니다.
라이브러리는 어떻게됩니까? 아니면 멀리 갈 거니? –
신경 쓰지 마라, 난 그냥 아무런 차이가 없다는 것을 깨달았다. –
@Let_Me_Be : 정적 라이브러리는 일반적으로 객체 파일의 모음이므로 나중에 프로그램에 링크 할 때 해결할 함수의 사본이 여러 개 포함될 것입니다. 공유 라이브러리는 일반적으로 프로그램처럼 링크되어 있으므로 여러 복사본을 제거 할 수 있습니다. –