2010-05-10 4 views
1

저는 현대 컴파일러가 인라인으로 정의 된 함수뿐만 아니라 객체 파일에있는 함수로 절차 적 통합을 수행 할 수 있다는 것을 알고 있습니다. 그러나 공유 라이브러리 (특히 dll)에 대해 프로그램을 컴파일 할 때도 마찬가지입니까? 대략 말하기 : 기능 코드가 dll에서 실행 파일로 복사됩니다 (원하는 경우).컴파일러는 dll에서 가져온 함수의 절차 적 통합을 수행 할 수 있습니까?

답변

4

아니요. 컴파일러에는 해당 기능을 구성하는 코드가 없으므로 아니오입니다.

Windows에서 동적 라이브러리를 링크 할 때 대개 동적 라이브러리를로드하고 호출하는 함수에 대한 포인터를 얻는 코드가 포함 된 가져 오기 라이브러리에 대한 헤더와 링크를 포함합니다 (기술적으로 가져 오기 라이브러리가 필요하지 않으며 수동으로 LoadLibrary() 및 친구에게 전화 할 수도 있습니다.

컴파일러는 코드를 동적 라이브러리 자체에서 볼 수 없기 때문에 코드에서 인라인 확장을 수행 할 수 없습니다.

+0

그래서 사소한 본문을 dll의 바이너리에 넣는 대신 사소한 방법 (예 : 접근 자)을 인라인으로 정의하는 것이 좋지 않다고 생각합니까? 라이브러리가 바이너리 호환을 인식하지 못하고 소스가 각 바이너리와 함께 다시 컴파일된다고 가정합니다. 그리고 런타임에로드되지 않습니다! – doc

+0

@doc : 일반적으로 헤더 파일에서 간단한 메소드를 인라인으로 정의합니다. 그러나 dllexport를 사용하여 선언하는 것이 옵티 마이저의 동작에 영향을 줄 수 있습니다 (즉, 옵티 마이저가 명시 적으로 인라인 확장을 수행하지 못할 수 있음). 나는 그 중 하나에 대한 연구를해야 할 것입니다. –

+0

적어도 g ++에서는 dllexport에 영향을주는 인라인이라는 사실을 이미 알 수 있습니다. 인라인으로 정의 된 메소드는 기호 테이블이나 이진 코드로 내보내지지 않습니다. (그러나 클래스의 클래스 선언 옆에 인라인으로 선언해야합니다. (이것은 FAQ 규칙 [9.9]가 http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.9)를 적용하지 않는 곳입니다). 물론 그렇게한다면 더 좋을 것이지만, 절차 적 통합이 없다면 각각의 사소한 세트 나 get은 glVertex() 증후군을 초래하는 함수 호출 메커니즘을 통해 수행됩니다. – doc

관련 문제