내 프로그램의 다른 클래스에서 사용되는 많은 정적 함수가있는 도우미 클래스가 있습니다. 예 : C++의 정적 멤버 함수가 여러 번역 단위로 복사됩니까?
helper.h
Class helper {
public:
static void fn1()
{ /* defined in header itself */ }
/* fn2 defined in src file helper.cpp */
static void fn2();
}
도우미 정적 멤버 함수를 갖는다. 따라서 다른 모듈에서 도우미 객체를 만들지 않습니다. 도우미 기능과 같은 다른 모듈에 사용되는 :
A.cpp
#include "helper.h"
A::foo() {
helper::fn1();
helper::fn2();
}
B.cpp
#include "helper.h"
B::foo() {
helper::fn1();
helper::fn2();
}
컴파일러가 A.cpp
및 B.cpp
에서 도우미 기능의 별도의 복사본을 만들 수 있습니까? 나는 몇몇 초기 게시물을 읽었고 컴파일러가 생성 할 응답들로부터 모았다. 그러나 fn1
과 fn2
의 주소를 printf("Address of fn1 is %p\n", &helper::fn1);
과 printf("Address of fn1 is %p\n", &helper::fn1);
으로 모두 A.cpp
과 B.cpp
에서 인쇄하면 동일한 주소가 표시됩니다. 나는 지금 혼란 스럽다. 누군가가 뭔가를 놓친다면 분명히 해줄 수 있습니까?
헬퍼 함수의 여러 복사본이 생길 경우 (그럴 경우) 우리는 실행 가능한 크기를 줄이려고 노력하고 최적화하려고했습니다.
+1. 나는 조금 더주의 깊게 질문을 읽어야했다;) 내 지위를 삭제했다. – Mahesh
@snkrish : 템플릿 정적 멤버 함수 또는 템플릿 정적 전역 함수입니까? 정적 멤버 함수 인 경우 템플릿 매개 변수의 각 조합에 대해 새 복사본을 얻지 만 컴파일 단위의 수는 여전히 영향을 미치지 않습니다. 정적 전역 (또는 네임 스페이스) 함수 인 경우 각 컴파일 단위에서 새 복사본을 가져옵니다. –
자세한 답변을 주셔서 감사합니다. 이제 주소가 같은 이유를 알았습니다. 후속 질문이 있는데 별도의 게시물을 시작해야할지 모르겠습니다. 위의 fn2가 템플릿을 사용하여 작성된 경우 : template static void fn2(); - 헤더 자체에 fn2를 정의해야합니다. 또는 실행 파일 크기를 최적화하기 위해 extern 템플릿 helper :: fn2() {/ * helper.cpp * /} 정의 템플릿을 사용해야합니까? 컴파일러는 fn2가 정의 된 방법과 관계없이 다른 T로 호출 될 때마다 함수의 복사본을 만듭니다. –
cppcoder