공부 중 정적 링크(Static Link)와 동적 링크(Dynamic Link)의 차이에 대해 갈피를 잡기가 어려워서 조금 더 찾아보았다.
ChatGPT 를 통해 습득한 정보라 정확하지 않을 수 있지만 내가 이해한 내용은 아래와 같다.
// MyClass.h
class MyClass {
private:
int m_garbage1;
int m_garbage2;
public:
void MyFunction();
void GarbageFunction1();
void GarbageFunction2();
};
// main.cpp
#include "MyClass.h"
int main() {
MyClass obj;
obj.MyFunction();
return 0;
}
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
cv::imshow("Image", image);
cv::waitKey(0);
return 0;
}
정적 링크는 컴파일 단계에서 내가 필요한 코드가 있는 파일 전체를 포함하는 것이다.
동적 링크는 런타임 단계에서 내가 필요한 코드 부분만 포함하는 것이다.
위 코드로 정적 링크의 예를 들면 다음과 같다.
나는 MyClass 의 MyFunction 만 실행하고 싶은데 MyFunction 뿐만 아니라 MyClass 에 있는 모든 변수나 함수(m_garbage, GarbageFunction)들이 포함되어 메모리의 낭비가 발생한다.
동적 링크는 정적 링크와 반대 되는 상황이라고 생각하면 된다. 내가 opencv 를 사용하지 않기 때문에 opencv 가 일반적으로 동적 링크 되는지는 알지 못하지만 동적 링크로 사용된다고 가정하겠다. cv::imread 할 때, cv::imshow 할 때, cv::waitKey 를 수행할 때 마다 각각 함수 실행에 필요한 코드 영역들이 메모리 상에 로드된 후 수행이 끝나면 해제되는 것이 동적 링크가 가지는 차이점이다. 동적 링크는 운영체제 단계에서 관리하므로 정확히 언제 해제하는지 알 수 없지만 아마도 더 이상 자주 사용되지 않는다고 판단되는 시점에 알아서 메모리에서 해제하는 것으로 보인다.
동적 링크가 항상 이득일지 의문이 들어서 ChatGPT 에게 물어보았다.


결론적으로 말하자면 완벽한 이득은 아니지만 그럼에도 불구하고 정적 링크를 사용하였을 때 얻는 이득이 동적 링크를 사용하였을 때에 비해 미미하기 때문에 동적 링크를 사용하는 것이 이득이라고 한다.